├── .circleci └── config.yml ├── .codacy.yml ├── .dockerignore ├── .editorconfig ├── .gitattributes ├── .gitignore ├── .travis.yml ├── .watchmanconfig ├── CHANGELOG.md ├── Dockerfile ├── Jenkinsfile.old ├── LICENSE ├── README.md ├── android ├── .settings │ └── org.eclipse.buildship.core.prefs ├── Gemfile ├── Gemfile.lock ├── app │ ├── .classpath │ ├── .project │ ├── .settings │ │ └── org.eclipse.buildship.core.prefs │ ├── BUCK │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ ├── appcenter-config.json │ │ └── fonts │ │ │ ├── Entypo.ttf │ │ │ ├── EvilIcons.ttf │ │ │ ├── Feather.ttf │ │ │ ├── FontAwesome.ttf │ │ │ ├── FontAwesome5_Brands.ttf │ │ │ ├── FontAwesome5_Regular.ttf │ │ │ ├── FontAwesome5_Solid.ttf │ │ │ ├── Foundation.ttf │ │ │ ├── Ionicons.ttf │ │ │ ├── MaterialCommunityIcons.ttf │ │ │ ├── MaterialIcons.ttf │ │ │ ├── Octicons.ttf │ │ │ ├── SimpleLineIcons.ttf │ │ │ ├── Zocial.ttf │ │ │ └── fontello.ttf │ │ ├── java │ │ └── com │ │ │ └── monicahq │ │ │ └── app │ │ │ ├── MainActivity.java │ │ │ └── MainApplication.java │ │ └── res │ │ ├── drawable-hdpi │ │ └── launch_screen.png │ │ ├── drawable-mdpi │ │ └── launch_screen.png │ │ ├── drawable-xhdpi │ │ └── launch_screen.png │ │ ├── drawable-xxhdpi │ │ └── launch_screen.png │ │ ├── drawable-xxxhdpi │ │ └── launch_screen.png │ │ ├── layout │ │ └── launch_screen.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-ldpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── fastlane │ ├── Appfile │ ├── Fastfile │ ├── Pluginfile │ └── README.md ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── keystores │ ├── BUCK │ └── debug.keystore.properties └── settings.gradle ├── app.json ├── babel.config.js ├── codecov.yml ├── commitlint.config.js ├── docs ├── change-splash-screens.md └── running-the-app.md ├── e2e ├── config.json ├── i18n │ └── index.ts ├── init.js ├── services │ ├── form.ts │ └── login.ts └── tests │ └── login.spec.ts ├── index.js ├── ios ├── Gemfile ├── Gemfile.lock ├── Monica-tvOS │ └── Info.plist ├── Monica-tvOSTests │ └── Info.plist ├── Monica.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ ├── Monica-tvOS.xcscheme │ │ └── Monica.xcscheme ├── Monica.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Monica │ ├── AppCenter-Config.plist │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-20x20@2x.png │ │ │ ├── Icon-20x20@3x.png │ │ │ ├── Icon-29x29@1x.png │ │ │ ├── Icon-29x29@2x.png │ │ │ ├── Icon-29x29@3x.png │ │ │ ├── Icon-40x40@2x.png │ │ │ ├── Icon-40x40@3x.png │ │ │ ├── Icon-60x60@2x.png │ │ │ ├── Icon-60x60@3x.png │ │ │ └── Icon-marketing-1024x1024.png │ │ ├── Contents.json │ │ └── LaunchImage.launchimage │ │ │ ├── Contents.json │ │ │ ├── iPhone Landscape iOS8 – Retina HD 5.5.png │ │ │ ├── iPhone Portrait iOS 5,6 1x.png │ │ │ ├── iPhone Portrait iOS5,6 – 2x.png │ │ │ ├── iPhone Portrait iOS5,6 – Retina 4.png │ │ │ ├── iPhone Portrait iOS7+ – 2x.png │ │ │ ├── iPhone Portrait iOS7,8 – Retina 4.png │ │ │ ├── iPhone Portrait iOS8 – Retina HD 4.7.png │ │ │ ├── iPhone Portrait iOS8 – Retina HD 5.5.png │ │ │ ├── iPhone X Landscape - iOS 11+.png │ │ │ └── iPhone X Portrait - iOS 11+.png │ ├── Info.plist │ ├── Monica.entitlements │ └── main.m ├── MonicaTests │ ├── Info.plist │ └── MonicaTests.m ├── Podfile ├── Podfile.lock ├── Pods │ ├── AppCenter │ │ └── AppCenter-SDK-Apple │ │ │ └── iOS │ │ │ ├── AppCenter.framework │ │ │ ├── AppCenter │ │ │ ├── Headers │ │ │ │ ├── AppCenter.h │ │ │ │ ├── MSAbstractLog.h │ │ │ │ ├── MSAppCenter.h │ │ │ │ ├── MSAppCenterErrors.h │ │ │ │ ├── MSChannelDelegate.h │ │ │ │ ├── MSChannelGroupProtocol.h │ │ │ │ ├── MSChannelProtocol.h │ │ │ │ ├── MSConstants.h │ │ │ │ ├── MSCustomProperties.h │ │ │ │ ├── MSDevice.h │ │ │ │ ├── MSEnable.h │ │ │ │ ├── MSLog.h │ │ │ │ ├── MSLogWithProperties.h │ │ │ │ ├── MSLogger.h │ │ │ │ ├── MSService.h │ │ │ │ ├── MSServiceAbstract.h │ │ │ │ ├── MSWrapperLogger.h │ │ │ │ └── MSWrapperSdk.h │ │ │ └── Modules │ │ │ │ └── module.modulemap │ │ │ ├── AppCenterAnalytics.framework │ │ │ ├── AppCenterAnalytics │ │ │ ├── Headers │ │ │ │ ├── AppCenterAnalytics.h │ │ │ │ ├── MSAbstractLog.h │ │ │ │ ├── MSAnalytics.h │ │ │ │ ├── MSAnalyticsAuthenticationProvider.h │ │ │ │ ├── MSAnalyticsAuthenticationProviderDelegate.h │ │ │ │ ├── MSAnalyticsTransmissionTarget.h │ │ │ │ ├── MSEventLog.h │ │ │ │ ├── MSLogWithNameAndProperties.h │ │ │ │ ├── MSLogWithProperties.h │ │ │ │ ├── MSPropertyConfigurator.h │ │ │ │ ├── MSService.h │ │ │ │ └── MSServiceAbstract.h │ │ │ └── Modules │ │ │ │ └── module.modulemap │ │ │ ├── AppCenterCrashes.framework │ │ │ ├── AppCenterCrashes │ │ │ ├── Headers │ │ │ │ ├── AppCenterCrashes.h │ │ │ │ ├── MSAbstractLog.h │ │ │ │ ├── MSCrashHandlerSetupDelegate.h │ │ │ │ ├── MSCrashes.h │ │ │ │ ├── MSCrashesDelegate.h │ │ │ │ ├── MSErrorAttachmentLog+Utility.h │ │ │ │ ├── MSErrorAttachmentLog.h │ │ │ │ ├── MSErrorReport.h │ │ │ │ ├── MSService.h │ │ │ │ ├── MSServiceAbstract.h │ │ │ │ └── MSWrapperCrashesHelper.h │ │ │ └── Modules │ │ │ │ └── module.modulemap │ │ │ └── LICENSE │ ├── AppCenterReactNativeShared │ │ └── AppCenterReactNativeShared │ │ │ ├── AppCenterReactNativeShared.framework │ │ │ ├── AppCenterReactNativeShared │ │ │ ├── Headers │ │ │ │ └── AppCenterReactNativeShared.h │ │ │ └── Modules │ │ │ │ └── module.modulemap │ │ │ └── LICENSE.md │ ├── Headers │ │ └── Public │ │ │ ├── AppCenter │ │ │ ├── AppCenter │ │ │ │ ├── AppCenter.h │ │ │ │ ├── MSAbstractLog.h │ │ │ │ ├── MSAppCenter.h │ │ │ │ ├── MSAppCenterErrors.h │ │ │ │ ├── MSChannelDelegate.h │ │ │ │ ├── MSChannelGroupProtocol.h │ │ │ │ ├── MSChannelProtocol.h │ │ │ │ ├── MSConstants.h │ │ │ │ ├── MSCustomProperties.h │ │ │ │ ├── MSDevice.h │ │ │ │ ├── MSEnable.h │ │ │ │ ├── MSLog.h │ │ │ │ ├── MSLogWithProperties.h │ │ │ │ ├── MSLogger.h │ │ │ │ ├── MSService.h │ │ │ │ ├── MSServiceAbstract.h │ │ │ │ ├── MSWrapperLogger.h │ │ │ │ └── MSWrapperSdk.h │ │ │ ├── AppCenterAnalytics │ │ │ │ ├── AppCenterAnalytics.h │ │ │ │ ├── MSAbstractLog.h │ │ │ │ ├── MSAnalytics.h │ │ │ │ ├── MSAnalyticsAuthenticationProvider.h │ │ │ │ ├── MSAnalyticsAuthenticationProviderDelegate.h │ │ │ │ ├── MSAnalyticsTransmissionTarget.h │ │ │ │ ├── MSEventLog.h │ │ │ │ ├── MSLogWithNameAndProperties.h │ │ │ │ ├── MSLogWithProperties.h │ │ │ │ ├── MSPropertyConfigurator.h │ │ │ │ ├── MSService.h │ │ │ │ └── MSServiceAbstract.h │ │ │ └── AppCenterCrashes │ │ │ │ ├── AppCenterCrashes.h │ │ │ │ ├── MSAbstractLog.h │ │ │ │ ├── MSCrashHandlerSetupDelegate.h │ │ │ │ ├── MSCrashes.h │ │ │ │ ├── MSCrashesDelegate.h │ │ │ │ ├── MSErrorAttachmentLog+Utility.h │ │ │ │ ├── MSErrorAttachmentLog.h │ │ │ │ ├── MSErrorReport.h │ │ │ │ ├── MSService.h │ │ │ │ ├── MSServiceAbstract.h │ │ │ │ └── MSWrapperCrashesHelper.h │ │ │ └── AppCenterReactNativeShared │ │ │ └── AppCenterReactNativeShared │ │ │ └── AppCenterReactNativeShared.h │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ └── Target Support Files │ │ ├── Pods-Monica-tvOS │ │ ├── Pods-Monica-tvOS-acknowledgements.markdown │ │ ├── Pods-Monica-tvOS-acknowledgements.plist │ │ ├── Pods-Monica-tvOS-dummy.m │ │ ├── Pods-Monica-tvOS-frameworks.sh │ │ ├── Pods-Monica-tvOS-resources.sh │ │ ├── Pods-Monica-tvOS.debug.xcconfig │ │ └── Pods-Monica-tvOS.release.xcconfig │ │ ├── Pods-Monica-tvOSTests │ │ ├── Pods-Monica-tvOSTests-acknowledgements.markdown │ │ ├── Pods-Monica-tvOSTests-acknowledgements.plist │ │ ├── Pods-Monica-tvOSTests-dummy.m │ │ ├── Pods-Monica-tvOSTests-frameworks.sh │ │ ├── Pods-Monica-tvOSTests-resources.sh │ │ ├── Pods-Monica-tvOSTests.debug.xcconfig │ │ └── Pods-Monica-tvOSTests.release.xcconfig │ │ ├── Pods-Monica │ │ ├── Pods-Monica-acknowledgements.markdown │ │ ├── Pods-Monica-acknowledgements.plist │ │ ├── Pods-Monica-dummy.m │ │ ├── Pods-Monica-frameworks.sh │ │ ├── Pods-Monica-resources.sh │ │ ├── Pods-Monica.debug.xcconfig │ │ └── Pods-Monica.release.xcconfig │ │ └── Pods-MonicaTests │ │ ├── Pods-MonicaTests-acknowledgements.markdown │ │ ├── Pods-MonicaTests-acknowledgements.plist │ │ ├── Pods-MonicaTests-dummy.m │ │ ├── Pods-MonicaTests-frameworks.sh │ │ ├── Pods-MonicaTests-resources.sh │ │ ├── Pods-MonicaTests.debug.xcconfig │ │ └── Pods-MonicaTests.release.xcconfig ├── devices.txt └── fastlane │ ├── Appfile │ ├── Fastfile │ └── README.md ├── jest.config.js ├── package.json ├── setupJest.ts ├── src ├── App.spec.tsx ├── App.tsx ├── CodePush.tsx ├── __mock__ │ └── contact.ts ├── api │ ├── __tests__ │ │ ├── activities.spec.ts │ │ ├── calls.spec.ts │ │ ├── contacts.spec.ts │ │ ├── debts.spec.ts │ │ ├── gifts.spec.ts │ │ ├── notes.spec.ts │ │ ├── reminder.spec.ts │ │ ├── tasks.spec.ts │ │ └── user.spec.ts │ ├── activities.ts │ ├── calls.ts │ ├── contacts.ts │ ├── debts.ts │ ├── gifts.ts │ ├── index.ts │ ├── notes.ts │ ├── package.json │ ├── reminders.ts │ ├── tasks.ts │ └── user.ts ├── assets │ ├── icons │ │ ├── activities.png │ │ ├── activities@2x.png │ │ ├── activities@3x.png │ │ ├── debts.png │ │ ├── debts@2x.png │ │ ├── debts@3x.png │ │ ├── gift.png │ │ ├── gift@2x.png │ │ ├── gift@3x.png │ │ ├── notes.png │ │ ├── notes@2x.png │ │ ├── notes@3x.png │ │ ├── phone.png │ │ ├── phone@2x.png │ │ ├── phone@3x.png │ │ ├── reminders.png │ │ ├── reminders@2x.png │ │ ├── reminders@3x.png │ │ ├── tasks.png │ │ ├── tasks@2x.png │ │ └── tasks@3x.png │ ├── logo.png │ ├── logo@2x.png │ ├── logo@3x.png │ └── package.json ├── components │ ├── Back │ │ ├── Back.android.tsx │ │ ├── Back.ios.tsx │ │ ├── Back.props.ts │ │ ├── Back.styles.android.ts │ │ ├── Back.styles.ios.ts │ │ ├── __tests__ │ │ │ ├── Back.android.spec.tsx │ │ │ ├── Back.ios.spec.tsx │ │ │ ├── __snapshots__ │ │ │ │ ├── Back.android.spec.tsx.snap │ │ │ │ └── Back.ios.spec.tsx.snap │ │ │ ├── index.android.spec.ts │ │ │ └── index.ios.spec.ts │ │ └── index.ts │ ├── BottomNav │ │ ├── BottomNav.styles.ts │ │ ├── BottomNav.tsx │ │ ├── __tests__ │ │ │ ├── BottomNav.spec.tsx │ │ │ └── __snapshots__ │ │ │ │ └── BottomNav.spec.tsx.snap │ │ └── index.ts │ ├── Button │ │ ├── Button.android.tsx │ │ ├── Button.ios.tsx │ │ ├── Button.props.ts │ │ ├── Button.styles.ts │ │ ├── __tests__ │ │ │ ├── Button.android.spec.tsx │ │ │ ├── Button.ios.spec.tsx │ │ │ ├── __snapshots__ │ │ │ │ ├── Button.android.spec.tsx.snap │ │ │ │ └── Button.ios.spec.tsx.snap │ │ │ ├── index.android.spec.ts │ │ │ └── index.ios.spec.ts │ │ └── index.ts │ ├── Checkbox │ │ ├── Checkbox.android.tsx │ │ ├── Checkbox.ios.tsx │ │ ├── Checkbox.props.ts │ │ ├── Checkbox.styles.ts │ │ ├── __tests__ │ │ │ ├── Checkbox.android.spec.tsx │ │ │ ├── Checkbox.ios.spec.tsx │ │ │ ├── __snapshots__ │ │ │ │ ├── Checkbox.android.spec.tsx.snap │ │ │ │ └── Checkbox.ios.spec.tsx.snap │ │ │ ├── index.android.spec.ts │ │ │ └── index.ios.spec.ts │ │ └── index.ts │ ├── ContactAvatar │ │ ├── ContactAvatar.styles.ts │ │ ├── ContactAvatar.tsx │ │ ├── __tests__ │ │ │ ├── ContactAvatar.spec.tsx │ │ │ └── __snapshots__ │ │ │ │ └── ContactAvatar.spec.tsx.snap │ │ └── index.ts │ ├── ContactListItem │ │ ├── ContactListItem.styles.ts │ │ ├── ContactListItem.tsx │ │ ├── __tests__ │ │ │ ├── ContactListItem.spec.tsx │ │ │ └── __snapshots__ │ │ │ │ └── ContactListItem.spec.tsx.snap │ │ └── index.ts │ ├── EmptyActivity │ │ ├── EmptyActivities.styles.ts │ │ ├── EmptyActivity.tsx │ │ ├── __tests__ │ │ │ ├── EmptyActivity.spec.tsx │ │ │ └── __snapshots__ │ │ │ │ └── EmptyActivity.spec.tsx.snap │ │ └── index.ts │ ├── FontelloIcon │ │ ├── FontelloIcon.ts │ │ ├── config.json │ │ ├── fontello.ttf │ │ └── index.ts │ ├── LastTwoYearsStatistics │ │ ├── LastTwoYearsStatistics.styles.ts │ │ ├── LastTwoYearsStatistics.tsx │ │ ├── __tests__ │ │ │ ├── LastTwoYearsStatistics.spec.tsx │ │ │ └── __snapshots__ │ │ │ │ └── LastTwoYearsStatistics.spec.tsx.snap │ │ └── index.ts │ ├── ListItem │ │ ├── ListItem.styles.ts │ │ ├── ListItem.tsx │ │ ├── __tests__ │ │ │ ├── ListItem.spec.tsx │ │ │ └── __snapshots__ │ │ │ │ └── ListItem.spec.tsx.snap │ │ └── index.ts │ ├── Navbar │ │ ├── Navbar.android.tsx │ │ ├── Navbar.ios.tsx │ │ ├── Navbar.props.ts │ │ ├── Navbar.styles.ts │ │ ├── __tests__ │ │ │ ├── Navbar.android.spec.tsx │ │ │ ├── Navbar.ios.spec.tsx │ │ │ ├── __snapshots__ │ │ │ │ ├── Navbar.android.spec.tsx.snap │ │ │ │ └── Navbar.ios.spec.tsx.snap │ │ │ ├── index.android.spec.ts │ │ │ └── index.ios.spec.ts │ │ ├── back │ │ │ ├── NavbarIOSBack.styles.ts │ │ │ ├── NavbarIOSBack.tsx │ │ │ └── __tests__ │ │ │ │ ├── NavbarIOSBack.spec.tsx │ │ │ │ └── __snapshots__ │ │ │ │ └── NavbarIOSBack.spec.tsx.snap │ │ └── index.ts │ ├── Tabbar │ │ ├── Tabbar.styles.ts │ │ ├── Tabbar.tsx │ │ └── __tests__ │ │ │ ├── Tabbar.android.spec.tsx │ │ │ ├── Tabbar.ios.spec.tsx │ │ │ └── __snapshots__ │ │ │ ├── Tabbar.android.spec.tsx.snap │ │ │ └── Tabbar.ios.spec.tsx.snap │ ├── Touchable │ │ ├── Touchable.tsx │ │ ├── __tests__ │ │ │ ├── Touchable.spec.tsx │ │ │ └── __snapshots__ │ │ │ │ └── Touchable.spec.tsx.snap │ │ └── index.ts │ ├── form │ │ ├── ContactChooser │ │ │ ├── ContactChooser.styles.ts │ │ │ ├── ContactChooser.tsx │ │ │ ├── __tests__ │ │ │ │ ├── ContactChooser.spec.tsx │ │ │ │ └── __snapshots__ │ │ │ │ │ └── ContactChooser.spec.tsx.snap │ │ │ └── index.ts │ │ ├── FormListItem │ │ │ ├── FormListItem.styles.ts │ │ │ ├── FormListItem.tsx │ │ │ ├── __tests__ │ │ │ │ ├── FormListItem.spec.tsx │ │ │ │ └── __snapshots__ │ │ │ │ │ └── FormListItem.spec.tsx.snap │ │ │ └── index.ts │ │ ├── Switch │ │ │ ├── Switch.styles.ts │ │ │ ├── Switch.tsx │ │ │ ├── __tests__ │ │ │ │ ├── Switch.spec.tsx │ │ │ │ └── __snapshots__ │ │ │ │ │ └── Switch.spec.tsx.snap │ │ │ └── index.ts │ │ └── TextInput │ │ │ ├── TextInput.styles.ts │ │ │ ├── TextInput.tsx │ │ │ ├── __tests__ │ │ │ ├── TextInput.spec.tsx │ │ │ ├── TextInput.styles.android.spec.ts │ │ │ ├── TextInput.styles.ios.spec.ts │ │ │ └── __snapshots__ │ │ │ │ └── TextInput.spec.tsx.snap │ │ │ └── index.ts │ ├── index.ts │ └── package.json ├── containers │ ├── ActionSheet │ │ ├── ActionSheet.tsx │ │ ├── ActionSheetContainer.ts │ │ └── index.ts │ ├── CodePush │ │ ├── CodePush.tsx │ │ └── CodePushContainer.tsx │ ├── Contacts │ │ ├── Contacts.styles.ts │ │ ├── Contacts.tsx │ │ ├── ContactsContainer.ts │ │ ├── Navbar │ │ │ ├── Navbar.android.tsx │ │ │ ├── Navbar.ios.tsx │ │ │ ├── Navbar.props.ts │ │ │ ├── Navbar.styles.ts │ │ │ ├── Navbar.ts │ │ │ └── __tests__ │ │ │ │ ├── Navbar.ios.spec.tsx │ │ │ │ └── __snapshots__ │ │ │ │ └── Navbar.ios.spec.tsx.snap │ │ ├── __tests__ │ │ │ ├── Contacts.spec.tsx │ │ │ └── __snapshots__ │ │ │ │ └── Contacts.spec.tsx.snap │ │ └── assets │ │ │ ├── no-contacts.png │ │ │ ├── no-contacts@2x.png │ │ │ ├── no-contacts@3x.png │ │ │ ├── no-results.png │ │ │ ├── no-results@2x.png │ │ │ └── no-results@3x.png │ └── InitialState │ │ ├── InitialState.ts │ │ └── InitialStateContainer.ts ├── i18n │ ├── index.ts │ ├── locales │ │ ├── en │ │ │ ├── activities.ts │ │ │ ├── auth.ts │ │ │ ├── calls.ts │ │ │ ├── common.ts │ │ │ ├── contacts.ts │ │ │ ├── debts.ts │ │ │ ├── gifts.ts │ │ │ ├── index.ts │ │ │ ├── notes.ts │ │ │ ├── reminders.ts │ │ │ ├── settings.ts │ │ │ └── tasks.ts │ │ └── fr │ │ │ ├── activities.ts │ │ │ ├── auth.ts │ │ │ ├── calls.ts │ │ │ ├── common.ts │ │ │ ├── contacts.ts │ │ │ ├── debts.ts │ │ │ ├── gifts.ts │ │ │ ├── index.ts │ │ │ ├── notes.ts │ │ │ ├── reminders.ts │ │ │ ├── settings.ts │ │ │ └── tasks.ts │ └── package.json ├── models │ ├── actions.ts │ ├── activity.ts │ ├── call.ts │ ├── contact.ts │ ├── debt.ts │ ├── gift.ts │ ├── index.ts │ ├── note.ts │ ├── operations.ts │ ├── package.json │ ├── reminder.ts │ └── task.ts ├── navigator │ ├── AppNavigator.tsx │ ├── AppStack.ts │ ├── AuthStack.ts │ ├── NavigationService.ts │ ├── TabsNavigator.ts │ └── package.json ├── package.json ├── pages │ ├── AddContactScreen.tsx │ ├── Auth │ │ ├── Launch │ │ │ ├── Launch.tsx │ │ │ ├── LaunchScreen.ts │ │ │ ├── __tests__ │ │ │ │ ├── Launch.spec.tsx │ │ │ │ └── __snapshots__ │ │ │ │ │ └── Launch.spec.tsx.snap │ │ │ └── assets │ │ │ │ ├── launch.png │ │ │ │ ├── launch@2x.png │ │ │ │ └── launch@3x.png │ │ └── Login │ │ │ ├── Login.tsx │ │ │ ├── LoginScreen.ts │ │ │ ├── __tests__ │ │ │ ├── Login.spec.tsx │ │ │ ├── LoginScreen.spec.ts │ │ │ └── __snapshots__ │ │ │ │ └── Login.spec.tsx.snap │ │ │ ├── assets │ │ │ ├── login.png │ │ │ ├── login@2x.png │ │ │ └── login@3x.png │ │ │ └── form │ │ │ ├── LoginForm.model.ts │ │ │ ├── LoginForm.tsx │ │ │ ├── LoginFormContainer.ts │ │ │ └── __tests__ │ │ │ └── LoginFormContainer.spec.ts │ ├── ChooseContacts │ │ ├── ChooseContacts.tsx │ │ └── ChooseContactsScreen.ts │ ├── Contact │ │ ├── Contact.styles.ts │ │ ├── Contact.tsx │ │ ├── ContactActivityRow │ │ │ ├── ContactActivityRow.styles.ts │ │ │ ├── ContactActivityRow.tsx │ │ │ └── __tests__ │ │ │ │ ├── ContactActivityRow.spec.tsx │ │ │ │ └── __snapshots__ │ │ │ │ └── ContactActivityRow.spec.tsx.snap │ │ ├── ContactInfos │ │ │ ├── Contact.styles.tsx │ │ │ ├── Contact.tsx │ │ │ ├── ContactInfos.tsx │ │ │ ├── Meet.styles.tsx │ │ │ ├── Meet.tsx │ │ │ ├── Relationships.styles.tsx │ │ │ ├── Relationships.tsx │ │ │ ├── Work.styles.tsx │ │ │ ├── Work.tsx │ │ │ └── __tests__ │ │ │ │ ├── Contact.spec.tsx │ │ │ │ ├── ContactInfos.spec.tsx │ │ │ │ ├── Meet.spec.tsx │ │ │ │ ├── Relationships.spec.tsx │ │ │ │ └── __snapshots__ │ │ │ │ ├── Contact.spec.tsx.snap │ │ │ │ ├── ContactInfos.spec.tsx.snap │ │ │ │ ├── Meet.spec.tsx.snap │ │ │ │ └── Relationships.spec.tsx.snap │ │ ├── ContactScreen.ts │ │ └── __tests__ │ │ │ └── Contact.spec.tsx │ ├── Contacts │ │ ├── Contacts.tsx │ │ └── ContactsScreen.ts │ ├── DashboardScreen.tsx │ ├── Entities │ │ ├── Activities │ │ │ └── List │ │ │ │ ├── ActivitiesList.styles.ts │ │ │ │ ├── ActivitiesList.tsx │ │ │ │ ├── ActivitiesListScreen.ts │ │ │ │ ├── __tests__ │ │ │ │ ├── ActivitiesList.spec.tsx │ │ │ │ ├── ActivitiesListScreen.spec.ts │ │ │ │ └── __snapshots__ │ │ │ │ │ └── ActivitiesList.spec.tsx.snap │ │ │ │ └── assets │ │ │ │ ├── empty-activities.png │ │ │ │ ├── empty-activities@2x.png │ │ │ │ └── empty-activities@3x.png │ │ ├── Calls │ │ │ └── List │ │ │ │ ├── CallsList.styles.ts │ │ │ │ ├── CallsList.tsx │ │ │ │ ├── CallsListScreen.ts │ │ │ │ ├── __tests__ │ │ │ │ ├── CallsList.spec.tsx │ │ │ │ ├── CallsListScreen.spec.ts │ │ │ │ └── __snapshots__ │ │ │ │ │ └── CallsList.spec.tsx.snap │ │ │ │ └── assets │ │ │ │ ├── empty-calls.png │ │ │ │ ├── empty-calls@2x.png │ │ │ │ └── empty-calls@3x.png │ │ ├── Debts │ │ │ └── List │ │ │ │ ├── DebtsList.styles.tsx │ │ │ │ ├── DebtsList.tsx │ │ │ │ ├── DebtsListScreen.tsx │ │ │ │ ├── __tests__ │ │ │ │ ├── DebtsList.spec.tsx │ │ │ │ ├── DebtsListScreen.spec.ts │ │ │ │ └── __snapshots__ │ │ │ │ │ └── DebtsList.spec.tsx.snap │ │ │ │ └── assets │ │ │ │ ├── empty-debts.png │ │ │ │ ├── empty-debts@2x.png │ │ │ │ └── empty-debts@3x.png │ │ ├── Gifts │ │ │ └── List │ │ │ │ ├── GiftsList.styles.ts │ │ │ │ ├── GiftsList.tsx │ │ │ │ ├── GiftsListScreen.ts │ │ │ │ ├── __tests__ │ │ │ │ ├── GiftsList.spec.tsx │ │ │ │ └── GiftsListScreen.spec.ts │ │ │ │ └── assets │ │ │ │ ├── empty-gifts.png │ │ │ │ ├── empty-gifts@2x.png │ │ │ │ └── empty-gifts@3x.png │ │ ├── Notes │ │ │ ├── List │ │ │ │ ├── NotesList.styles.ts │ │ │ │ ├── NotesList.tsx │ │ │ │ ├── NotesListScreen.ts │ │ │ │ ├── __tests__ │ │ │ │ │ ├── NotesList.spec.tsx │ │ │ │ │ ├── NotesListScreen.spec.ts │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── NotesList.spec.tsx.snap │ │ │ │ └── assets │ │ │ │ │ ├── empty-notes.png │ │ │ │ │ ├── empty-notes@2x.png │ │ │ │ │ └── empty-notes@3x.png │ │ │ └── Upsert │ │ │ │ ├── NoteUpsert.tsx │ │ │ │ ├── NoteUpsertScreen.tsx │ │ │ │ ├── NotesUpsert.style.ts │ │ │ │ ├── __tests__ │ │ │ │ ├── NoteUpsert.spec.tsx │ │ │ │ ├── NoteUpsertScreen.spec.tsx │ │ │ │ └── __snapshots__ │ │ │ │ │ └── NoteUpsert.spec.tsx.snap │ │ │ │ └── form │ │ │ │ ├── NoteForm.model.ts │ │ │ │ ├── NoteForm.styles.ts │ │ │ │ ├── NoteForm.tsx │ │ │ │ └── NoteFormContainer.tsx │ │ ├── Reminders │ │ │ └── List │ │ │ │ ├── RemindersList.styles.ts │ │ │ │ ├── RemindersList.tsx │ │ │ │ ├── RemindersListScreen.ts │ │ │ │ ├── __tests__ │ │ │ │ ├── RemindersList.spec.tsx │ │ │ │ ├── RemindersListScreen.spec.ts │ │ │ │ └── __snapshots__ │ │ │ │ │ └── RemindersList.spec.tsx.snap │ │ │ │ └── assets │ │ │ │ ├── empty-reminders.png │ │ │ │ ├── empty-reminders@2x.png │ │ │ │ └── empty-reminders@3x.png │ │ └── Tasks │ │ │ └── List │ │ │ ├── TasksList.styles.ts │ │ │ ├── TasksList.tsx │ │ │ ├── TasksListScreen.ts │ │ │ ├── __tests__ │ │ │ ├── TasksList.spec.tsx │ │ │ ├── TasksListScreen.spec.ts │ │ │ └── __snapshots__ │ │ │ │ └── TasksList.spec.tsx.snap │ │ │ └── assets │ │ │ ├── empty-tasks.png │ │ │ ├── empty-tasks@2x.png │ │ │ └── empty-tasks@3x.png │ ├── JournalScreen.tsx │ └── Settings │ │ ├── Settings.styles.ts │ │ ├── Settings.tsx │ │ ├── SettingsScreen.ts │ │ └── __tests__ │ │ ├── Settings.spec.tsx │ │ ├── SettingsScreen.spec.ts │ │ └── __snapshots__ │ │ └── Settings.spec.tsx.snap ├── redux │ ├── activities │ │ ├── __tests__ │ │ │ ├── actions.spec.ts │ │ │ ├── operations.spec.ts │ │ │ └── reducer.spec.ts │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── operations.ts │ │ ├── reducer.ts │ │ └── types.ts │ ├── beta │ │ ├── __tests__ │ │ │ ├── actions.spec.ts │ │ │ ├── operations.spec.ts │ │ │ └── reducers.spec.ts │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── operations.ts │ │ ├── reducer.ts │ │ └── types.ts │ ├── calls │ │ ├── __tests__ │ │ │ ├── actions.spec.ts │ │ │ ├── operations.spec.ts │ │ │ └── reducer.spec.ts │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── operations.ts │ │ ├── reducer.ts │ │ └── types.ts │ ├── configureStore.ts │ ├── contacts │ │ ├── __tests__ │ │ │ ├── actions.spec.ts │ │ │ └── operations.spec.ts │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── operations.ts │ │ ├── reducer.ts │ │ └── types.ts │ ├── debts │ │ ├── __tests__ │ │ │ ├── actions.spec.ts │ │ │ ├── operations.spec.ts │ │ │ └── reducer.spec.ts │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── operations.ts │ │ ├── reducer.ts │ │ └── types.ts │ ├── gifts │ │ ├── __tests__ │ │ │ ├── actions.spec.ts │ │ │ ├── operations.spec.ts │ │ │ └── reducer.spec.ts │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── operations.ts │ │ ├── reducer.ts │ │ └── types.ts │ ├── notes │ │ ├── __tests__ │ │ │ ├── actions.spec.ts │ │ │ ├── operations.spec.ts │ │ │ └── reducer.spec.ts │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── operations.ts │ │ ├── reducer.ts │ │ └── types.ts │ ├── package.json │ ├── reminders │ │ ├── __tests__ │ │ │ ├── actions.spec.ts │ │ │ ├── operations.spec.ts │ │ │ └── reducer.spec.ts │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── operations.ts │ │ ├── reducer.ts │ │ └── types.ts │ ├── rootReducer.ts │ ├── tasks │ │ ├── __tests__ │ │ │ ├── actions.spec.ts │ │ │ ├── operations.spec.ts │ │ │ └── reducer.spec.ts │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── operations.ts │ │ ├── reducer.ts │ │ └── types.ts │ └── user │ │ ├── __tests__ │ │ ├── actions.spec.ts │ │ ├── operations.spec.ts │ │ └── reducer.spec.ts │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── operations.ts │ │ ├── reducer.ts │ │ └── types.ts ├── storage-keys.ts ├── theme │ ├── appScreen.ts │ ├── index.ts │ ├── package.json │ └── preAuthScreen.ts └── utils │ ├── __tests__ │ ├── contacts.spec.ts │ └── gifts.spec.ts │ ├── contacts.ts │ ├── gifts.ts │ └── package.json ├── tsconfig.json ├── tslint.json ├── wallaby.js └── yarn.lock /.codacy.yml: -------------------------------------------------------------------------------- 1 | engines: 2 | rubocop: 3 | enabled: true 4 | duplication: 5 | enabled: true 6 | metrics: 7 | enabled: true 8 | coverage: 9 | enabled: true 10 | 11 | exclude_paths: 12 | - '*.spec.ts' 13 | - '**/__tests__/**' 14 | - 'ios/**/*' 15 | - 'android/**/*' 16 | - 'e2e/**/*' 17 | - 'e2e/*' 18 | - 'jest.config.js' 19 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | end_of_line = lf 3 | insert_final_newline = true 4 | indent_style = space 5 | indent_size = 2 6 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # language: objective-c 2 | os: osx 3 | osx_image: xcode9.4 4 | 5 | env: 6 | # - VERSION=iPhone7 7 | - VERSION=iPhoneX 8 | # - VERSION=iPhone5s 9 | - VERSION=iPhoneSE 10 | 11 | cache: 12 | directories: 13 | - node_modules 14 | 15 | install: 16 | - brew tap wix/brew 17 | - brew install applesimutils 18 | - curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash 19 | - export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" 20 | - nvm install stable 21 | - nvm use stable 22 | 23 | # - npm install -g react-native-cli 24 | # - npm install -g detox-cli 25 | - npm install 26 | # - cd ios && pod install && cd .. 27 | # - detox clean-framework-cache && detox build-framework-cache 28 | 29 | script: 30 | - npm run test:e2e:build:ci -- -c ios.sim.release.${VERSION} > /dev/null 31 | - npm run test:e2e:ci -- -c ios.sim.release.${VERSION} 32 | 33 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:8.11 2 | 3 | WORKDIR /opt/project 4 | 5 | RUN npm i -g yarn 6 | 7 | # cache deps 8 | COPY .cache/package.json package.json 9 | COPY .cache/yarn.lock yarn.lock 10 | RUN yarn 11 | 12 | COPY package.json package.json 13 | COPY yarn.lock yarn.lock 14 | RUN yarn 15 | 16 | CMD sleep 300 17 | -------------------------------------------------------------------------------- /Jenkinsfile.old: -------------------------------------------------------------------------------- 1 | def dockerImage 2 | 3 | pipeline { 4 | agent any; 5 | stages { 6 | stage('Build docker image') { 7 | steps { 8 | script { 9 | dockerImage = docker.build("build") 10 | } 11 | } 12 | } 13 | stage('Run Tests') { 14 | parallel { 15 | stage('Test') { 16 | steps { 17 | script { 18 | dockerImage.inside { 19 | sh 'yarn' 20 | sh 'yarn test --runInBand --coverage' 21 | } 22 | } 23 | } 24 | } 25 | stage('Check typescript') { 26 | steps { 27 | script { 28 | dockerImage.inside { 29 | sh 'yarn' 30 | sh 'yarn tsc' 31 | } 32 | } 33 | } 34 | } 35 | } 36 | } 37 | } 38 | post { 39 | always { 40 | cleanWs() 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /android/.settings/org.eclipse.buildship.core.prefs: -------------------------------------------------------------------------------- 1 | #Tue Jan 16 00:29:07 EST 2018 2 | connection.project.dir= 3 | -------------------------------------------------------------------------------- /android/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | 5 | plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') 6 | eval_gemfile(plugins_path) if File.exist?(plugins_path) 7 | -------------------------------------------------------------------------------- /android/app/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /android/app/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | app 4 | Project app created by Buildship. 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | org.eclipse.buildship.core.gradleprojectbuilder 15 | 16 | 17 | 18 | 19 | 20 | org.eclipse.jdt.core.javanature 21 | org.eclipse.buildship.core.gradleprojectnature 22 | 23 | 24 | -------------------------------------------------------------------------------- /android/app/.settings/org.eclipse.buildship.core.prefs: -------------------------------------------------------------------------------- 1 | #Tue Jan 16 00:29:07 EST 2018 2 | connection.project.dir=.. 3 | -------------------------------------------------------------------------------- /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 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /android/app/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | NEVER_SEND 4 | NEVER_SEND 5 | Monica Dev 6 | 7 | -------------------------------------------------------------------------------- /android/app/src/main/assets/appcenter-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "app_secret": "5436460a-3b7b-4761-8e4b-77f0499f9067" 3 | } -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Entypo.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/Entypo.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/EvilIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/EvilIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Feather.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/Feather.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/FontAwesome.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/FontAwesome.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/FontAwesome5_Brands.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/FontAwesome5_Brands.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/FontAwesome5_Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/FontAwesome5_Regular.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/FontAwesome5_Solid.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/FontAwesome5_Solid.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Foundation.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/Foundation.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/Ionicons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/MaterialIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/MaterialIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Octicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/Octicons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/SimpleLineIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/SimpleLineIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Zocial.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/Zocial.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/fontello.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/assets/fonts/fontello.ttf -------------------------------------------------------------------------------- /android/app/src/main/java/com/monicahq/app/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.monicahq.app; 2 | 3 | import com.facebook.react.ReactActivity; 4 | import android.os.Bundle; 5 | import org.devio.rn.splashscreen.SplashScreen; 6 | 7 | public class MainActivity extends ReactActivity { 8 | 9 | @Override 10 | protected void onCreate(Bundle savedInstanceState) { 11 | SplashScreen.show(this); 12 | super.onCreate(savedInstanceState); 13 | } 14 | 15 | /** 16 | * Returns the name of the main component registered from JavaScript. 17 | * This is used to schedule rendering of the component. 18 | */ 19 | @Override 20 | protected String getMainComponentName() { 21 | return "Monica"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/launch_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/res/drawable-hdpi/launch_screen.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/launch_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/res/drawable-mdpi/launch_screen.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/launch_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/res/drawable-xhdpi/launch_screen.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/launch_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/res/drawable-xxhdpi/launch_screen.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/launch_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/res/drawable-xxxhdpi/launch_screen.png -------------------------------------------------------------------------------- /android/app/src/main/res/layout/launch_screen.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-ldpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/res/mipmap-ldpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #000000 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ALWAYS_SEND 4 | ALWAYS_SEND 5 | Monica 6 | 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/fastlane/Appfile: -------------------------------------------------------------------------------- 1 | json_key_file "mobile-creds/android/play-store.json" # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one 2 | package_name "com.monicahq.app" # e.g. com.krausefx.app 3 | -------------------------------------------------------------------------------- /android/fastlane/Pluginfile: -------------------------------------------------------------------------------- 1 | # Autogenerated by fastlane 2 | # 3 | # Ensure this file is checked in to source control! 4 | 5 | gem 'fastlane-plugin-increment_version_code' 6 | gem 'fastlane-plugin-versioning_android' 7 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip 6 | -------------------------------------------------------------------------------- /android/keystores/BUCK: -------------------------------------------------------------------------------- 1 | keystore( 2 | name = "debug", 3 | properties = "debug.keystore.properties", 4 | store = "debug.keystore", 5 | visibility = [ 6 | "PUBLIC", 7 | ], 8 | ) 9 | -------------------------------------------------------------------------------- /android/keystores/debug.keystore.properties: -------------------------------------------------------------------------------- 1 | key.store=debug.keystore 2 | key.alias=androiddebugkey 3 | key.store.password=android 4 | key.alias.password=android 5 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Monica", 3 | "displayName": "Monica" 4 | } -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['module:metro-react-native-babel-preset'], 3 | plugins: ['@babel/plugin-transform-runtime'], 4 | exclude: ['**/*.png', '**/*.gif'] 5 | } -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | codecov: 2 | allow_coverage_offsets: false 3 | ignore: 4 | - "tools" -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = {extends: ['@commitlint/config-conventional']}; 2 | -------------------------------------------------------------------------------- /docs/change-splash-screens.md: -------------------------------------------------------------------------------- 1 | ## Instructions to change splash screens 2 | 3 | https://medium.com/handlebar-labs/how-to-add-a-splash-screen-to-a-react-native-app-ios-and-android-30a3cec835ae 4 | -------------------------------------------------------------------------------- /e2e/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "setupTestFrameworkScriptFile" : "./init.js", 3 | "transform": { 4 | "^.+\\.ts?$": "ts-jest", 5 | "^.+\\.tsx?$": "ts-jest" 6 | }, 7 | "testMatch": [ 8 | "**/*.spec.{ts,tsx}" 9 | ], 10 | "moduleFileExtensions": [ 11 | "ts", 12 | "tsx", 13 | "js", 14 | "jsx", 15 | "json", 16 | "node" 17 | ], 18 | "transformIgnorePatterns": [ 19 | "node_modules/(?!(jest-)?react-native|react-navigation|moment)" 20 | ], 21 | "globals": { 22 | "jest": true 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /e2e/i18n/index.ts: -------------------------------------------------------------------------------- 1 | import i18next = require('i18next'); 2 | import en from '../../src/i18n/locales/en'; 3 | 4 | i18next.init({ 5 | lng: 'e ', 6 | fallbackLng: 'en', 7 | resources: {en}, 8 | }); 9 | 10 | export const I18n = i18next; 11 | -------------------------------------------------------------------------------- /e2e/init.js: -------------------------------------------------------------------------------- 1 | const detox = require('detox'); 2 | const config = require('../package.json').detox; 3 | 4 | // Set the default test timeout of 120s 5 | jest.setTimeout(120000); 6 | 7 | beforeAll(async () => { 8 | await detox.init(config); 9 | }); 10 | 11 | afterAll(async () => { 12 | await detox.cleanup(); 13 | }); 14 | -------------------------------------------------------------------------------- /e2e/services/login.ts: -------------------------------------------------------------------------------- 1 | export class LoginPage { 2 | public static async get() { 3 | await device.reloadReactNative(); 4 | await element(by.id('goToLogin')).tap(); 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import {AppRegistry} from 'react-native'; 2 | import {App} from './src/App'; 3 | 4 | console.disableYellowBox = true; 5 | 6 | AppRegistry.registerComponent('Monica', () => App); 7 | -------------------------------------------------------------------------------- /ios/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | -------------------------------------------------------------------------------- /ios/Monica-tvOSTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 0.7.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 33 23 | 24 | 25 | -------------------------------------------------------------------------------- /ios/Monica.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Monica.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Monica/AppCenter-Config.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AppSecret 6 | d5ddac46-248a-464a-a5da-cbc45b85f975 7 | 8 | -------------------------------------------------------------------------------- /ios/Monica/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | @interface AppDelegate : UIResponder 13 | 14 | @property (nonatomic, strong) UIWindow *window; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-20x20@3x.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-29x29@1x.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-29x29@2x.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-29x29@3x.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-40x40@2x.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-40x40@3x.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-60x60@2x.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-60x60@3x.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-marketing-1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/AppIcon.appiconset/Icon-marketing-1024x1024.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Landscape iOS8 – Retina HD 5.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Landscape iOS8 – Retina HD 5.5.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS 5,6 1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS 5,6 1x.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS5,6 – 2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS5,6 – 2x.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS5,6 – Retina 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS5,6 – Retina 4.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS7+ – 2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS7+ – 2x.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS7,8 – Retina 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS7,8 – Retina 4.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS8 – Retina HD 4.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS8 – Retina HD 4.7.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS8 – Retina HD 5.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone Portrait iOS8 – Retina HD 5.5.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone X Landscape - iOS 11+.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone X Landscape - iOS 11+.png -------------------------------------------------------------------------------- /ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone X Portrait - iOS 11+.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Monica/Images.xcassets/LaunchImage.launchimage/iPhone X Portrait - iOS 11+.png -------------------------------------------------------------------------------- /ios/Monica/Monica.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Monica/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | #import "AppDelegate.h" 13 | 14 | int main(int argc, char * argv[]) { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /ios/MonicaTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 0.7.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 33 23 | 24 | 25 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'Monica' do 5 | pod 'AppCenter/Crashes', '~> 1.9.0' 6 | pod 'AppCenter/Analytics', '~> 1.9.0' 7 | pod 'AppCenterReactNativeShared', '~> 1.8.1' 8 | # Uncomment the next line if you're using Swift or would like to use dynamic frameworks 9 | # use_frameworks! 10 | 11 | # Pods for Monica 12 | 13 | 14 | platform :ios, '9.0' 15 | target 'MonicaTests' do 16 | inherit! :search_paths 17 | # Pods for testing 18 | end 19 | 20 | end 21 | 22 | target 'Monica-tvOS' do 23 | # Uncomment the next line if you're using Swift or would like to use dynamic frameworks 24 | # use_frameworks! 25 | 26 | # Pods for Monica-tvOS 27 | 28 | target 'Monica-tvOSTests' do 29 | inherit! :search_paths 30 | # Pods for testing 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - AppCenter/Analytics (1.9.0): 3 | - AppCenter/Core 4 | - AppCenter/Core (1.9.0) 5 | - AppCenter/Crashes (1.9.0): 6 | - AppCenter/Core 7 | - AppCenterReactNativeShared (1.8.1): 8 | - AppCenter/Core (= 1.9.0) 9 | 10 | DEPENDENCIES: 11 | - AppCenter/Analytics (~> 1.9.0) 12 | - AppCenter/Crashes (~> 1.9.0) 13 | - AppCenterReactNativeShared (~> 1.8.1) 14 | 15 | SPEC REPOS: 16 | https://github.com/cocoapods/specs.git: 17 | - AppCenter 18 | - AppCenterReactNativeShared 19 | 20 | SPEC CHECKSUMS: 21 | AppCenter: 3cf7b9387549e9703dab068793e404013e8c0cc1 22 | AppCenterReactNativeShared: 3d804f256b964e040d902d1a215d7866fedae55d 23 | 24 | PODFILE CHECKSUM: a3ee1981cffe88e44a942c6814aa5e3b6c001f4c 25 | 26 | COCOAPODS: 1.5.3 27 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/AppCenter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/AppCenter -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/AppCenter.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSAbstractLog.h" 4 | #import "MSAppCenter.h" 5 | #import "MSAppCenterErrors.h" 6 | #import "MSChannelDelegate.h" 7 | #import "MSChannelGroupProtocol.h" 8 | #import "MSChannelProtocol.h" 9 | #import "MSConstants.h" 10 | #import "MSDevice.h" 11 | #import "MSEnable.h" 12 | #import "MSLog.h" 13 | #import "MSLogWithProperties.h" 14 | #import "MSLogger.h" 15 | #import "MSService.h" 16 | #import "MSServiceAbstract.h" 17 | #import "MSWrapperLogger.h" 18 | #import "MSWrapperSdk.h" 19 | 20 | #if !TARGET_OS_TV 21 | #import "MSCustomProperties.h" 22 | #endif 23 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSAbstractLog.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface MSAbstractLog : NSObject 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSAppCenterErrors.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | NS_ASSUME_NONNULL_BEGIN 4 | 5 | #pragma mark - Domain 6 | 7 | extern NSString *const kMSACErrorDomain; 8 | 9 | #pragma mark - Log 10 | 11 | // Error codes 12 | NS_ENUM(NSInteger){kMSACLogInvalidContainerErrorCode = 1}; 13 | 14 | // Error descriptions 15 | extern NSString const *kMSACLogInvalidContainerErrorDesc; 16 | 17 | #pragma mark - Connection 18 | 19 | // Error codes 20 | NS_ENUM(NSInteger){kMSACConnectionSuspendedErrorCode = 100, 21 | kMSACConnectionHttpErrorCode = 101}; 22 | 23 | // Error descriptions 24 | extern NSString const *kMSACConnectionHttpErrorDesc; 25 | extern NSString const *kMSACConnectionSuspendedErrorDesc; 26 | 27 | // Error user info keys 28 | extern NSString const *kMSACConnectionHttpCodeErrorKey; 29 | 30 | NS_ASSUME_NONNULL_END 31 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSEnable.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * Protocol to define an instance that can be enabled/disabled. 5 | */ 6 | @protocol MSEnable 7 | 8 | @required 9 | 10 | /** 11 | * Enable/disable this instance and delete data on disabled state. 12 | * 13 | * @param isEnabled A boolean value set to YES to enable the instance or NO to 14 | * disable it. 15 | * @param deleteData A boolean value set to YES to delete data or NO to keep 16 | * it. 17 | */ 18 | - (void)setEnabled:(BOOL)isEnabled andDeleteDataOnDisabled:(BOOL)deleteData; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSLogWithProperties.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSAbstractLog.h" 4 | 5 | @interface MSLogWithProperties : MSAbstractLog 6 | 7 | /** 8 | * Additional key/value pair parameters. [optional] 9 | */ 10 | @property(nonatomic) NSDictionary *properties; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSService.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * Protocol declaring service logic. 5 | */ 6 | @protocol MSService 7 | 8 | /** 9 | * Enable/disable this service. 10 | * 11 | * @param isEnabled whether this service is enabled or not. 12 | * @see isEnabled 13 | */ 14 | + (void)setEnabled:(BOOL)isEnabled; 15 | 16 | /** 17 | * Is this service enabled. 18 | * 19 | * @return a boolean whether this service is enabled or not. 20 | * @see setEnabled: 21 | */ 22 | + (BOOL)isEnabled; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSWrapperLogger.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSConstants.h" 4 | 5 | /** 6 | * This is a utility for producing App Center style log messages. It is only 7 | * intended for use by App Center services and wrapper SDKs of App Center. 8 | */ 9 | @interface MSWrapperLogger : NSObject 10 | 11 | + (void)MSWrapperLog:(MSLogMessageProvider)message 12 | tag:(NSString *)tag 13 | level:(MSLogLevel)level; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module AppCenter { 2 | umbrella header "AppCenter.h" 3 | 4 | export * 5 | module * { export * } 6 | 7 | link framework "Foundation" 8 | link framework "CoreTelephony" 9 | link framework "SystemConfiguration" 10 | link framework "UIKit" 11 | link "sqlite3" 12 | link "z" 13 | } 14 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/AppCenterAnalytics: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/AppCenterAnalytics -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/AppCenterAnalytics.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSAbstractLog.h" 4 | #import "MSAnalytics.h" 5 | #import "MSAnalyticsTransmissionTarget.h" 6 | #import "MSAnalyticsAuthenticationProvider.h" 7 | #import "MSAnalyticsAuthenticationProviderDelegate.h" 8 | #import "MSEventLog.h" 9 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSAbstractLog.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface MSAbstractLog : NSObject 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSEventLog.h: -------------------------------------------------------------------------------- 1 | #import "MSLogWithNameAndProperties.h" 2 | 3 | @interface MSEventLog : MSLogWithNameAndProperties 4 | 5 | /** 6 | * Unique identifier for this event. 7 | */ 8 | @property(nonatomic, copy) NSString *eventId; 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSLogWithNameAndProperties.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSLogWithProperties.h" 4 | 5 | @interface MSLogWithNameAndProperties : MSLogWithProperties 6 | 7 | /** 8 | * Name of the event. 9 | */ 10 | @property(nonatomic, copy) NSString *name; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSLogWithProperties.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSAbstractLog.h" 4 | 5 | @interface MSLogWithProperties : MSAbstractLog 6 | 7 | /** 8 | * Additional key/value pair parameters. [optional] 9 | */ 10 | @property(nonatomic) NSDictionary *properties; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSService.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * Protocol declaring service logic. 5 | */ 6 | @protocol MSService 7 | 8 | /** 9 | * Enable/disable this service. 10 | * 11 | * @param isEnabled whether this service is enabled or not. 12 | * @see isEnabled 13 | */ 14 | + (void)setEnabled:(BOOL)isEnabled; 15 | 16 | /** 17 | * Is this service enabled. 18 | * 19 | * @return a boolean whether this service is enabled or not. 20 | * @see setEnabled: 21 | */ 22 | + (BOOL)isEnabled; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module AppCenterAnalytics { 2 | umbrella header "AppCenterAnalytics.h" 3 | 4 | export * 5 | module * { export * } 6 | 7 | link framework "Foundation" 8 | link framework "UIKit" 9 | } 10 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/AppCenterCrashes: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/AppCenterCrashes -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/AppCenterCrashes.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "MSCrashHandlerSetupDelegate.h" 4 | #import "MSCrashes.h" 5 | #import "MSCrashesDelegate.h" 6 | #import "MSErrorAttachmentLog+Utility.h" 7 | #import "MSErrorAttachmentLog.h" 8 | #import "MSWrapperCrashesHelper.h" 9 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSAbstractLog.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface MSAbstractLog : NSObject 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSService.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * Protocol declaring service logic. 5 | */ 6 | @protocol MSService 7 | 8 | /** 9 | * Enable/disable this service. 10 | * 11 | * @param isEnabled whether this service is enabled or not. 12 | * @see isEnabled 13 | */ 14 | + (void)setEnabled:(BOOL)isEnabled; 15 | 16 | /** 17 | * Is this service enabled. 18 | * 19 | * @return a boolean whether this service is enabled or not. 20 | * @see setEnabled: 21 | */ 22 | + (BOOL)isEnabled; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module AppCenterCrashes { 2 | umbrella header "AppCenterCrashes.h" 3 | 4 | export * 5 | module * { export * } 6 | 7 | link framework "Foundation" 8 | link "c++" 9 | link "z" 10 | } 11 | -------------------------------------------------------------------------------- /ios/Pods/AppCenterReactNativeShared/AppCenterReactNativeShared/AppCenterReactNativeShared.framework/AppCenterReactNativeShared: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/ios/Pods/AppCenterReactNativeShared/AppCenterReactNativeShared/AppCenterReactNativeShared.framework/AppCenterReactNativeShared -------------------------------------------------------------------------------- /ios/Pods/AppCenterReactNativeShared/AppCenterReactNativeShared/AppCenterReactNativeShared.framework/Headers/AppCenterReactNativeShared.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @class MSWrapperSdk; 4 | 5 | @interface AppCenterReactNativeShared : NSObject 6 | 7 | + (void) setAppSecret: (NSString *)secret; 8 | 9 | + (NSString *) getAppSecret; 10 | 11 | + (void) configureAppCenter; 12 | 13 | + (MSWrapperSdk *) getWrapperSdk; 14 | 15 | + (void) setWrapperSdk:(MSWrapperSdk *)sdk; 16 | 17 | + (void) setStartAutomatically:(BOOL)shouldStartAutomatically; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /ios/Pods/AppCenterReactNativeShared/AppCenterReactNativeShared/AppCenterReactNativeShared.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module AppCenterReactNativeShared { 2 | umbrella header "AppCenterReactNativeShared.h" 3 | 4 | export * 5 | module * { export * } 6 | 7 | link framework "Foundation" 8 | } 9 | -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/AppCenter.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/AppCenter.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSAbstractLog.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSAbstractLog.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSAppCenter.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSAppCenter.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSAppCenterErrors.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSAppCenterErrors.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSChannelDelegate.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSChannelDelegate.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSChannelGroupProtocol.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSChannelGroupProtocol.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSChannelProtocol.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSChannelProtocol.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSConstants.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSConstants.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSCustomProperties.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSCustomProperties.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSDevice.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSDevice.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSEnable.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSEnable.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSLog.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSLog.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSLogWithProperties.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSLogWithProperties.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSLogger.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSLogger.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSService.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSService.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSServiceAbstract.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSServiceAbstract.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSWrapperLogger.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSWrapperLogger.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenter/MSWrapperSdk.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/Headers/MSWrapperSdk.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterAnalytics/AppCenterAnalytics.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/AppCenterAnalytics.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterAnalytics/MSAbstractLog.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSAbstractLog.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterAnalytics/MSAnalytics.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSAnalytics.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterAnalytics/MSAnalyticsAuthenticationProvider.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSAnalyticsAuthenticationProvider.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterAnalytics/MSAnalyticsAuthenticationProviderDelegate.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSAnalyticsAuthenticationProviderDelegate.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterAnalytics/MSAnalyticsTransmissionTarget.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSAnalyticsTransmissionTarget.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterAnalytics/MSEventLog.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSEventLog.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterAnalytics/MSLogWithNameAndProperties.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSLogWithNameAndProperties.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterAnalytics/MSLogWithProperties.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSLogWithProperties.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterAnalytics/MSPropertyConfigurator.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSPropertyConfigurator.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterAnalytics/MSService.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSService.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterAnalytics/MSServiceAbstract.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterAnalytics.framework/Headers/MSServiceAbstract.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterCrashes/AppCenterCrashes.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/AppCenterCrashes.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterCrashes/MSAbstractLog.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSAbstractLog.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterCrashes/MSCrashHandlerSetupDelegate.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSCrashHandlerSetupDelegate.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterCrashes/MSCrashes.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSCrashes.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterCrashes/MSCrashesDelegate.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSCrashesDelegate.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterCrashes/MSErrorAttachmentLog+Utility.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSErrorAttachmentLog+Utility.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterCrashes/MSErrorAttachmentLog.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSErrorAttachmentLog.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterCrashes/MSErrorReport.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSErrorReport.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterCrashes/MSService.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSService.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterCrashes/MSServiceAbstract.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSServiceAbstract.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenter/AppCenterCrashes/MSWrapperCrashesHelper.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenter/AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework/Headers/MSWrapperCrashesHelper.h -------------------------------------------------------------------------------- /ios/Pods/Headers/Public/AppCenterReactNativeShared/AppCenterReactNativeShared/AppCenterReactNativeShared.h: -------------------------------------------------------------------------------- 1 | ../../../../AppCenterReactNativeShared/AppCenterReactNativeShared/AppCenterReactNativeShared.framework/Headers/AppCenterReactNativeShared.h -------------------------------------------------------------------------------- /ios/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - AppCenter/Analytics (1.9.0): 3 | - AppCenter/Core 4 | - AppCenter/Core (1.9.0) 5 | - AppCenter/Crashes (1.9.0): 6 | - AppCenter/Core 7 | - AppCenterReactNativeShared (1.8.1): 8 | - AppCenter/Core (= 1.9.0) 9 | 10 | DEPENDENCIES: 11 | - AppCenter/Analytics (~> 1.9.0) 12 | - AppCenter/Crashes (~> 1.9.0) 13 | - AppCenterReactNativeShared (~> 1.8.1) 14 | 15 | SPEC REPOS: 16 | https://github.com/cocoapods/specs.git: 17 | - AppCenter 18 | - AppCenterReactNativeShared 19 | 20 | SPEC CHECKSUMS: 21 | AppCenter: 3cf7b9387549e9703dab068793e404013e8c0cc1 22 | AppCenterReactNativeShared: 3d804f256b964e040d902d1a215d7866fedae55d 23 | 24 | PODFILE CHECKSUM: a3ee1981cffe88e44a942c6814aa5e3b6c001f4c 25 | 26 | COCOAPODS: 1.5.3 27 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-Monica-tvOS/Pods-Monica-tvOS-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-Monica-tvOS/Pods-Monica-tvOS-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-Monica-tvOS/Pods-Monica-tvOS-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Monica_tvOS : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Monica_tvOS 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-Monica-tvOS/Pods-Monica-tvOS.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | OTHER_LDFLAGS = $(inherited) -ObjC 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 6 | PODS_ROOT = ${SRCROOT}/Pods 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-Monica-tvOS/Pods-Monica-tvOS.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | OTHER_LDFLAGS = $(inherited) -ObjC 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 6 | PODS_ROOT = ${SRCROOT}/Pods 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-Monica-tvOSTests/Pods-Monica-tvOSTests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-Monica-tvOSTests/Pods-Monica-tvOSTests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-Monica-tvOSTests/Pods-Monica-tvOSTests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Monica_tvOSTests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Monica_tvOSTests 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-Monica-tvOSTests/Pods-Monica-tvOSTests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | OTHER_LDFLAGS = $(inherited) -ObjC 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 6 | PODS_ROOT = ${SRCROOT}/Pods 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-Monica-tvOSTests/Pods-Monica-tvOSTests.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | OTHER_LDFLAGS = $(inherited) -ObjC 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 6 | PODS_ROOT = ${SRCROOT}/Pods 7 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-Monica/Pods-Monica-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Monica : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Monica 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-MonicaTests/Pods-MonicaTests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-MonicaTests/Pods-MonicaTests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-MonicaTests/Pods-MonicaTests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_MonicaTests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_MonicaTests 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-MonicaTests/Pods-MonicaTests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple/iOS" "${PODS_ROOT}/AppCenterReactNativeShared/AppCenterReactNativeShared" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AppCenter" "${PODS_ROOT}/Headers/Public/AppCenterReactNativeShared" 4 | OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AppCenter" -isystem "${PODS_ROOT}/Headers/Public/AppCenterReactNativeShared" 5 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"z" -framework "CoreTelephony" -framework "Foundation" -framework "SystemConfiguration" -framework "UIKit" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /ios/Pods/Target Support Files/Pods-MonicaTests/Pods-MonicaTests.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AppCenter/AppCenter-SDK-Apple/iOS" "${PODS_ROOT}/AppCenterReactNativeShared/AppCenterReactNativeShared" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AppCenter" "${PODS_ROOT}/Headers/Public/AppCenterReactNativeShared" 4 | OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AppCenter" -isystem "${PODS_ROOT}/Headers/Public/AppCenterReactNativeShared" 5 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"z" -framework "CoreTelephony" -framework "Foundation" -framework "SystemConfiguration" -framework "UIKit" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /ios/devices.txt: -------------------------------------------------------------------------------- 1 | Device ID Device Name 2 | d988d298307e29bd646dca1f58c14825cf5a82bd Theo's Iphone SE 3 | -------------------------------------------------------------------------------- /ios/fastlane/Appfile: -------------------------------------------------------------------------------- 1 | app_identifier "com.monicahq.app" # The bundle identifier of your app 2 | apple_id "rfreyd@fastmail.fm" # Your Apple email address 3 | 4 | itc_team_id "118957839" # iTunes Connect Team ID 5 | team_id "MVHSH3DLRY" # Developer Portal Team ID 6 | 7 | # For more information about the Appfile, see: 8 | # https://docs.fastlane.tools/advanced/#appfile 9 | -------------------------------------------------------------------------------- /ios/fastlane/README.md: -------------------------------------------------------------------------------- 1 | fastlane documentation 2 | ================ 3 | # Installation 4 | 5 | Make sure you have the latest version of the Xcode command line tools installed: 6 | 7 | ``` 8 | xcode-select --install 9 | ``` 10 | 11 | Install _fastlane_ using 12 | ``` 13 | [sudo] gem install fastlane -NV 14 | ``` 15 | or alternatively using `brew cask install fastlane` 16 | 17 | # Available Actions 18 | ## iOS 19 | ### ios beta 20 | ``` 21 | fastlane ios beta 22 | ``` 23 | Push a new beta build to TestFlight 24 | ### ios certificates 25 | ``` 26 | fastlane ios certificates 27 | ``` 28 | 29 | ### ios version 30 | ``` 31 | fastlane ios version 32 | ``` 33 | 34 | 35 | ---- 36 | 37 | This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. 38 | More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). 39 | The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). 40 | -------------------------------------------------------------------------------- /src/App.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | // import 'react-native'; 3 | // import renderer from 'react-test-renderer'; 4 | // import {App} from './App'; 5 | // TODO 6 | 7 | describe('App', () => { 8 | it('renders correctly', () => { 9 | expect(true).toBe(true); 10 | // renderer.create(); 11 | }); 12 | }); 13 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | import {Provider} from 'react-redux'; 3 | 4 | import configureStore from '@redux/configureStore'; 5 | import {CodePushContainer} from '@src/containers/CodePush/CodePushContainer'; 6 | import {AppNavigator} from '@src/navigator/AppNavigator'; 7 | import {codePush} from './CodePush'; 8 | 9 | const store = configureStore(); 10 | 11 | class MainApp extends PureComponent<{}, {}> { 12 | public render() { 13 | return [, ]; 14 | } 15 | } 16 | 17 | class AppWithoutCodePush extends PureComponent<{}, {}> { 18 | public render() { 19 | return ( 20 | 21 | 22 | 23 | ); 24 | } 25 | } 26 | 27 | export const App = codePush(AppWithoutCodePush); 28 | -------------------------------------------------------------------------------- /src/CodePush.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import RNCodePush from 'react-native-code-push'; 3 | 4 | export const codePush = (Component: React.ComponentType): React.ComponentType => 5 | RNCodePush({ 6 | checkFrequency: RNCodePush.CheckFrequency.MANUAL, 7 | })(Component); 8 | -------------------------------------------------------------------------------- /src/api/activities.ts: -------------------------------------------------------------------------------- 1 | export class Activities { 2 | private api; 3 | 4 | constructor(api) { 5 | this.api = api; 6 | } 7 | 8 | public async getAllByContact( 9 | contactId: number, 10 | page: number, 11 | limit: number = 20 12 | ) { 13 | try { 14 | const resp = await this.api.get( 15 | '/api/contacts/' + contactId + '/activities', 16 | { 17 | body: {page, limit}, 18 | } 19 | ); 20 | return resp.body; 21 | } catch (err) { 22 | throw err; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/api/calls.ts: -------------------------------------------------------------------------------- 1 | export class Calls { 2 | private api; 3 | 4 | constructor(api) { 5 | this.api = api; 6 | } 7 | 8 | public async getAllByContact( 9 | contactId: number, 10 | page: number, 11 | limit: number = 20 12 | ) { 13 | try { 14 | const resp = await this.api.get('/api/contacts/' + contactId + '/calls', { 15 | body: {page, limit}, 16 | }); 17 | return resp.body; 18 | } catch (err) { 19 | throw err; 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/api/contacts.ts: -------------------------------------------------------------------------------- 1 | export class Contacts { 2 | private api; 3 | 4 | constructor(api) { 5 | this.api = api; 6 | } 7 | 8 | public async getAll(page: number, limit: number = 20, query?: string) { 9 | try { 10 | const resp = await this.api.get('/api/contacts?with=contactfields', { 11 | body: {page, limit, query}, 12 | }); 13 | return resp.body; 14 | } catch (err) { 15 | throw err; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/api/debts.ts: -------------------------------------------------------------------------------- 1 | export class Debts { 2 | private api; 3 | 4 | constructor(api) { 5 | this.api = api; 6 | } 7 | 8 | public async getAllByContact( 9 | contactId: number, 10 | page: number, 11 | limit: number = 20 12 | ) { 13 | try { 14 | const resp = await this.api.get('/api/contacts/' + contactId + '/debts', { 15 | body: {page, limit}, 16 | }); 17 | return resp.body; 18 | } catch (err) { 19 | throw err; 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/api/gifts.ts: -------------------------------------------------------------------------------- 1 | export class Gifts { 2 | private api; 3 | 4 | constructor(api) { 5 | this.api = api; 6 | } 7 | 8 | public async getAllByContact( 9 | contactId: number, 10 | page: number, 11 | limit: number = 20 12 | ) { 13 | try { 14 | const resp = await this.api.get('/api/contacts/' + contactId + '/gifts', { 15 | body: {page, limit}, 16 | }); 17 | return resp.body; 18 | } catch (err) { 19 | throw err; 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@api" 3 | } 4 | -------------------------------------------------------------------------------- /src/api/reminders.ts: -------------------------------------------------------------------------------- 1 | export class Reminders { 2 | private api; 3 | 4 | constructor(api) { 5 | this.api = api; 6 | } 7 | 8 | public async getAllByContact( 9 | contactId: number, 10 | page: number, 11 | limit: number = 20 12 | ) { 13 | try { 14 | const resp = await this.api.get( 15 | '/api/contacts/' + contactId + '/reminders', 16 | { 17 | body: {page, limit}, 18 | } 19 | ); 20 | return resp.body; 21 | } catch (err) { 22 | throw err; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/api/tasks.ts: -------------------------------------------------------------------------------- 1 | type sortType = 2 | | 'completed_at' 3 | | '-completed_at' 4 | | 'created_at' 5 | | '-created_at' 6 | | 'updated_at' 7 | | '-updated_at'; 8 | 9 | export class Tasks { 10 | private api; 11 | 12 | constructor(api) { 13 | this.api = api; 14 | } 15 | 16 | public async getAllByContact( 17 | contactId: number, 18 | page: number, 19 | limit: number = 20, 20 | sort: sortType = 'completed_at' 21 | ) { 22 | try { 23 | const resp = await this.api.get('/api/contacts/' + contactId + '/tasks', { 24 | body: {sort, page, limit}, 25 | }); 26 | return resp.body; 27 | } catch (err) { 28 | throw err; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/api/user.ts: -------------------------------------------------------------------------------- 1 | export class User { 2 | private api; 3 | 4 | constructor(api) { 5 | this.api = api; 6 | } 7 | 8 | public async login(email: string, password: string) { 9 | try { 10 | const resp = await this.api.post('/oauth/login', { 11 | body: { 12 | email, 13 | password, 14 | }, 15 | }); 16 | return resp.body; 17 | } catch (err) { 18 | throw err; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/assets/icons/activities.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/activities.png -------------------------------------------------------------------------------- /src/assets/icons/activities@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/activities@2x.png -------------------------------------------------------------------------------- /src/assets/icons/activities@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/activities@3x.png -------------------------------------------------------------------------------- /src/assets/icons/debts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/debts.png -------------------------------------------------------------------------------- /src/assets/icons/debts@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/debts@2x.png -------------------------------------------------------------------------------- /src/assets/icons/debts@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/debts@3x.png -------------------------------------------------------------------------------- /src/assets/icons/gift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/gift.png -------------------------------------------------------------------------------- /src/assets/icons/gift@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/gift@2x.png -------------------------------------------------------------------------------- /src/assets/icons/gift@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/gift@3x.png -------------------------------------------------------------------------------- /src/assets/icons/notes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/notes.png -------------------------------------------------------------------------------- /src/assets/icons/notes@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/notes@2x.png -------------------------------------------------------------------------------- /src/assets/icons/notes@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/notes@3x.png -------------------------------------------------------------------------------- /src/assets/icons/phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/phone.png -------------------------------------------------------------------------------- /src/assets/icons/phone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/phone@2x.png -------------------------------------------------------------------------------- /src/assets/icons/phone@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/phone@3x.png -------------------------------------------------------------------------------- /src/assets/icons/reminders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/reminders.png -------------------------------------------------------------------------------- /src/assets/icons/reminders@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/reminders@2x.png -------------------------------------------------------------------------------- /src/assets/icons/reminders@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/reminders@3x.png -------------------------------------------------------------------------------- /src/assets/icons/tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/tasks.png -------------------------------------------------------------------------------- /src/assets/icons/tasks@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/tasks@2x.png -------------------------------------------------------------------------------- /src/assets/icons/tasks@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/icons/tasks@3x.png -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/logo@2x.png -------------------------------------------------------------------------------- /src/assets/logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/assets/logo@3x.png -------------------------------------------------------------------------------- /src/assets/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@assets" 3 | } 4 | -------------------------------------------------------------------------------- /src/components/Back/Back.android.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | import {TouchableWithoutFeedback} from 'react-native'; 3 | import Icon from 'react-native-vector-icons/MaterialIcons'; 4 | 5 | import {IBackProps} from './Back.props'; 6 | import {styles} from './Back.styles.android'; 7 | 8 | export class Back extends PureComponent { 9 | public render() { 10 | const {onPress} = this.props; 11 | return ( 12 | 13 | 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/Back/Back.ios.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | import {TouchableOpacity} from 'react-native'; 3 | import Icon from 'react-native-vector-icons/Ionicons'; 4 | 5 | import {hitSlop} from '@theme'; 6 | import {IBackProps} from './Back.props'; 7 | import {styles} from './Back.styles.ios'; 8 | 9 | export class Back extends PureComponent { 10 | public render() { 11 | const {onPress} = this.props; 12 | return ( 13 | 14 | 15 | 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/components/Back/Back.props.ts: -------------------------------------------------------------------------------- 1 | export interface IBackProps { 2 | onPress: (...args) => any; 3 | } 4 | -------------------------------------------------------------------------------- /src/components/Back/Back.styles.android.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | icon: { 5 | position: 'absolute', 6 | top: 16, 7 | left: 8, 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /src/components/Back/Back.styles.ios.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | icon: { 5 | position: 'absolute', 6 | top: 25, 7 | left: 15, 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /src/components/Back/__tests__/Back.android.spec.tsx: -------------------------------------------------------------------------------- 1 | import {shallow} from 'enzyme'; 2 | import toJson from 'enzyme-to-json'; 3 | import React from 'react'; 4 | import {Back} from '../Back.android'; 5 | 6 | describe('Components', () => { 7 | describe('Back', () => { 8 | describe('Android', () => { 9 | it('should renders correctly', () => { 10 | const onPress = jest.fn(); 11 | expect(toJson(shallow())).toMatchSnapshot(); 12 | }); 13 | 14 | it('should call onPress when taping the icon', () => { 15 | const onPress = jest.fn(); 16 | const button = shallow(); 17 | button.prop('onPress')(); 18 | expect(onPress).toHaveBeenCalledTimes(1); 19 | expect(onPress).toHaveBeenCalledWith(); 20 | }); 21 | }); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/components/Back/__tests__/Back.ios.spec.tsx: -------------------------------------------------------------------------------- 1 | import {shallow} from 'enzyme'; 2 | import toJson from 'enzyme-to-json'; 3 | import React from 'react'; 4 | import {Back} from '../Back.ios'; 5 | 6 | describe('Components', () => { 7 | describe('Back', () => { 8 | describe('IOS', () => { 9 | it('should renders correctly', () => { 10 | const onPress = jest.fn(); 11 | expect(toJson(shallow())).toMatchSnapshot(); 12 | }); 13 | 14 | it('should call onPress when taping the icon', () => { 15 | const onPress = jest.fn(); 16 | const button = shallow(); 17 | button.prop('onPress')(); 18 | expect(onPress).toHaveBeenCalledTimes(1); 19 | expect(onPress).toHaveBeenCalledWith(); 20 | }); 21 | }); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/components/Back/__tests__/__snapshots__/Back.android.spec.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Components Back Android should renders correctly 1`] = ` 4 | 7 | 20 | 21 | `; 22 | -------------------------------------------------------------------------------- /src/components/Back/__tests__/__snapshots__/Back.ios.spec.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Components Back IOS should renders correctly 1`] = ` 4 | 23 | 29 | 30 | `; 31 | -------------------------------------------------------------------------------- /src/components/Back/__tests__/index.android.spec.ts: -------------------------------------------------------------------------------- 1 | import {Back} from '../index'; 2 | 3 | jest.mock('../Back.android', () => ({Back: 'android'})); 4 | jest.mock('../Back.ios', () => ({Back: 'ios'})); 5 | 6 | jest.mock('react-native', () => ({ 7 | Platform: { 8 | OS: 'android', 9 | }, 10 | })); 11 | 12 | describe('Components', () => { 13 | describe('Back Index', () => { 14 | describe('android', () => { 15 | it('should return the android version', () => { 16 | expect(Back).toBe('android'); 17 | }); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /src/components/Back/__tests__/index.ios.spec.ts: -------------------------------------------------------------------------------- 1 | import {Back} from '../index'; 2 | 3 | jest.mock('../Back.android', () => ({Back: 'android'})); 4 | jest.mock('../Back.ios', () => ({Back: 'ios'})); 5 | 6 | jest.mock('react-native', () => ({ 7 | Platform: { 8 | OS: 'ios', 9 | }, 10 | })); 11 | 12 | describe('Components', () => { 13 | describe('Back Index', () => { 14 | describe('ios', () => { 15 | it('should return the ios version', () => { 16 | expect(Back).toBe('ios'); 17 | }); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /src/components/Back/index.ts: -------------------------------------------------------------------------------- 1 | import {Platform} from 'react-native'; 2 | import {Back as BackAndroid} from './Back.android'; 3 | import {Back as BackIOS} from './Back.ios'; 4 | 5 | export const Back = Platform.OS === 'ios' ? BackIOS : BackAndroid; 6 | -------------------------------------------------------------------------------- /src/components/BottomNav/BottomNav.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | bottomNav: { 5 | paddingVertical: 15, 6 | borderTopWidth: 1 / PixelRatio.get(), 7 | borderColor: '#E2E4E5', 8 | width: '100%', 9 | flexDirection: 'row', 10 | justifyContent: 'center', 11 | }, 12 | bottomLinkText: { 13 | color: '#1361cb', 14 | }, 15 | }); 16 | -------------------------------------------------------------------------------- /src/components/BottomNav/BottomNav.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | import {Text, TouchableOpacity, View} from 'react-native'; 3 | import {hitSlop} from '../../theme'; 4 | import {styles} from './BottomNav.styles'; 5 | 6 | interface IBottomNavProps { 7 | onPress: (...args) => any; 8 | title: string; 9 | linkTitle: string; 10 | } 11 | 12 | export class BottomNav extends PureComponent { 13 | public render() { 14 | const {onPress, title, linkTitle} = this.props; 15 | 16 | return ( 17 | 18 | {title} 19 | 20 | {linkTitle} 21 | 22 | 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/components/BottomNav/index.ts: -------------------------------------------------------------------------------- 1 | export * from './BottomNav'; 2 | -------------------------------------------------------------------------------- /src/components/Button/Button.props.ts: -------------------------------------------------------------------------------- 1 | export interface IButtonProps { 2 | id?: string; 3 | onPress: (...args) => any; 4 | children?: string; 5 | loading?: boolean; 6 | title?: string; 7 | disabled?: boolean; 8 | loadingTitle?: string; 9 | } 10 | -------------------------------------------------------------------------------- /src/components/Button/Button.styles.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | button: { 5 | height: 45, 6 | borderRadius: 5, 7 | marginVertical: 10, 8 | backgroundColor: 'rgb(43, 187, 72)', 9 | justifyContent: 'center', 10 | alignItems: 'center', 11 | width: '100%', 12 | flexDirection: 'row', 13 | }, 14 | activityIndicator: { 15 | marginLeft: 10, 16 | }, 17 | buttonDisabled: { 18 | backgroundColor: 'rgba(43, 187, 72, 0.4)', 19 | }, 20 | buttonText: { 21 | color: 'white', 22 | textAlign: 'center', 23 | fontWeight: 'bold', 24 | }, 25 | }); 26 | -------------------------------------------------------------------------------- /src/components/Button/__tests__/index.android.spec.ts: -------------------------------------------------------------------------------- 1 | import {Button} from '../index'; 2 | 3 | jest.mock('../Button.android', () => ({Button: 'android'})); 4 | jest.mock('../Button.ios', () => ({Button: 'ios'})); 5 | 6 | jest.mock('react-native', () => ({ 7 | Platform: { 8 | OS: 'android', 9 | }, 10 | })); 11 | 12 | describe('Components', () => { 13 | describe('Button Index', () => { 14 | describe('android', () => { 15 | it('should return the android version', () => { 16 | expect(Button).toBe('android'); 17 | }); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /src/components/Button/__tests__/index.ios.spec.ts: -------------------------------------------------------------------------------- 1 | import {Button} from '../index'; 2 | 3 | jest.mock('../Button.android', () => ({Button: 'android'})); 4 | jest.mock('../Button.ios', () => ({Button: 'ios'})); 5 | 6 | jest.mock('react-native', () => ({ 7 | Platform: { 8 | OS: 'ios', 9 | }, 10 | })); 11 | 12 | describe('Components', () => { 13 | describe('Button Index', () => { 14 | describe('ios', () => { 15 | it('should return the ios version', () => { 16 | expect(Button).toBe('ios'); 17 | }); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /src/components/Button/index.ts: -------------------------------------------------------------------------------- 1 | import {Platform} from 'react-native'; 2 | import {Button as ButtonAndroid} from './Button.android'; 3 | import {Button as ButtonIOS} from './Button.ios'; 4 | 5 | export const Button = Platform.OS === 'ios' ? ButtonIOS : ButtonAndroid; 6 | -------------------------------------------------------------------------------- /src/components/Checkbox/Checkbox.android.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | import {View} from 'react-native'; 3 | import Icon from 'react-native-vector-icons/Ionicons'; 4 | 5 | import {ICheckboxProps} from './Checkbox.props'; 6 | import {styles} from './Checkbox.styles'; 7 | 8 | export class Checkbox extends PureComponent { 9 | public render() { 10 | const {checked} = this.props; 11 | 12 | return ( 13 | 19 | {checked && } 20 | 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/components/Checkbox/Checkbox.ios.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | import {View} from 'react-native'; 3 | import Icon from 'react-native-vector-icons/Ionicons'; 4 | 5 | import {ICheckboxProps} from './Checkbox.props'; 6 | import {styles} from './Checkbox.styles'; 7 | 8 | export class Checkbox extends PureComponent { 9 | public render() { 10 | const {checked} = this.props; 11 | 12 | return ( 13 | 19 | {checked && } 20 | 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/components/Checkbox/Checkbox.props.ts: -------------------------------------------------------------------------------- 1 | export interface ICheckboxProps { 2 | checked: boolean; 3 | } 4 | -------------------------------------------------------------------------------- /src/components/Checkbox/Checkbox.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | const radius = 10; 4 | 5 | export const styles = StyleSheet.create({ 6 | container: { 7 | width: radius * 2, 8 | height: radius * 2, 9 | borderRadius: radius, 10 | alignItems: 'center', 11 | justifyContent: 'center', 12 | }, 13 | checkedContainer: { 14 | backgroundColor: '#057CFC', 15 | }, 16 | uncheckedContainer: { 17 | borderColor: '#979797', 18 | borderWidth: 1 / PixelRatio.get(), 19 | }, 20 | }); 21 | -------------------------------------------------------------------------------- /src/components/Checkbox/__tests__/Checkbox.android.spec.tsx: -------------------------------------------------------------------------------- 1 | import {shallow} from 'enzyme'; 2 | import toJson from 'enzyme-to-json'; 3 | import React from 'react'; 4 | import {Checkbox} from '../Checkbox.android'; 5 | 6 | describe('Components', () => { 7 | describe('Checkbox Android', () => { 8 | // const defaultOnPress = { 9 | // onPress: () => { 10 | // return; 11 | // }, 12 | // }; 13 | 14 | it('should renders correctly', () => { 15 | expect(toJson(shallow())).toMatchSnapshot(); 16 | expect(toJson(shallow())).toMatchSnapshot(); 17 | }); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /src/components/Checkbox/__tests__/Checkbox.ios.spec.tsx: -------------------------------------------------------------------------------- 1 | import {shallow} from 'enzyme'; 2 | import toJson from 'enzyme-to-json'; 3 | import React from 'react'; 4 | import {Checkbox} from '../Checkbox.ios'; 5 | 6 | describe('Components', () => { 7 | describe('Checkbox IOS', () => { 8 | // const defaultOnPress = { 9 | // onPress: () => { 10 | // return; 11 | // }, 12 | // }; 13 | 14 | it('should renders correctly', () => { 15 | expect(toJson(shallow())).toMatchSnapshot(); 16 | expect(toJson(shallow())).toMatchSnapshot(); 17 | }); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /src/components/Checkbox/__tests__/index.android.spec.ts: -------------------------------------------------------------------------------- 1 | import {Checkbox} from '../index'; 2 | 3 | jest.mock('../Checkbox.android', () => ({Checkbox: 'android'})); 4 | jest.mock('../Checkbox.ios', () => ({Checkbox: 'ios'})); 5 | 6 | jest.mock('react-native', () => ({ 7 | Platform: { 8 | OS: 'android', 9 | }, 10 | })); 11 | 12 | describe('Components', () => { 13 | describe('Checkbox Index', () => { 14 | describe('android', () => { 15 | it('should return the android version', () => { 16 | expect(Checkbox).toBe('android'); 17 | }); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /src/components/Checkbox/__tests__/index.ios.spec.ts: -------------------------------------------------------------------------------- 1 | import {Checkbox} from '../index'; 2 | 3 | jest.mock('../Checkbox.android', () => ({Checkbox: 'android'})); 4 | jest.mock('../Checkbox.ios', () => ({Checkbox: 'ios'})); 5 | 6 | jest.mock('react-native', () => ({ 7 | Platform: { 8 | OS: 'ios', 9 | }, 10 | })); 11 | 12 | describe('Components', () => { 13 | describe('Checkbox Index', () => { 14 | describe('ios', () => { 15 | it('should return the ios version', () => { 16 | expect(Checkbox).toBe('ios'); 17 | }); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /src/components/Checkbox/index.ts: -------------------------------------------------------------------------------- 1 | import {Platform} from 'react-native'; 2 | import {Checkbox as CheckboxAndroid} from './Checkbox.android'; 3 | import {Checkbox as CheckboxIOS} from './Checkbox.ios'; 4 | 5 | export const Checkbox = Platform.OS === 'ios' ? CheckboxIOS : CheckboxAndroid; 6 | -------------------------------------------------------------------------------- /src/components/ContactAvatar/ContactAvatar.styles.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | avatar: { 5 | borderRadius: 3, 6 | justifyContent: 'center', 7 | }, 8 | text: { 9 | fontSize: 20, 10 | color: 'white', 11 | textAlign: 'center', 12 | }, 13 | }); 14 | -------------------------------------------------------------------------------- /src/components/ContactAvatar/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ContactAvatar'; 2 | -------------------------------------------------------------------------------- /src/components/ContactListItem/ContactListItem.styles.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | container: { 5 | flexDirection: 'row', 6 | paddingHorizontal: 10, 7 | paddingVertical: 3, 8 | }, 9 | image: { 10 | borderRadius: 3, 11 | height: 50, 12 | width: 50, 13 | }, 14 | textContainer: { 15 | justifyContent: 'center', 16 | paddingHorizontal: 10, 17 | }, 18 | }); 19 | -------------------------------------------------------------------------------- /src/components/ContactListItem/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ContactListItem'; 2 | -------------------------------------------------------------------------------- /src/components/EmptyActivity/EmptyActivities.styles.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | container: { 5 | flex: 1, 6 | alignItems: 'center', 7 | backgroundColor: 'white', 8 | }, 9 | image: { 10 | marginBottom: 20, 11 | }, 12 | textContainer: { 13 | paddingHorizontal: 60, 14 | }, 15 | title: { 16 | textAlign: 'center', 17 | marginBottom: 10, 18 | }, 19 | subtitle: { 20 | fontSize: 13, 21 | textAlign: 'center', 22 | }, 23 | }); 24 | -------------------------------------------------------------------------------- /src/components/EmptyActivity/EmptyActivity.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | import {Image, Text, View} from 'react-native'; 3 | 4 | import {commonStyles} from '@theme'; 5 | import {styles} from './EmptyActivities.styles'; 6 | 7 | interface IEmptyActivityProps { 8 | title: string; 9 | subtitle?: string; 10 | image: number | {uri: string}; 11 | } 12 | 13 | export class EmptyActivity extends PureComponent { 14 | public render() { 15 | const {title, subtitle, image} = this.props; 16 | return ( 17 | 18 | 19 | 20 | 21 | 22 | {title} 23 | {subtitle && {subtitle}} 24 | 25 | 26 | 27 | 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/components/EmptyActivity/__tests__/EmptyActivity.spec.tsx: -------------------------------------------------------------------------------- 1 | import {shallow} from 'enzyme'; 2 | import toJson from 'enzyme-to-json'; 3 | import React from 'react'; 4 | import {EmptyActivity} from '../EmptyActivity'; 5 | 6 | describe('Components', () => { 7 | describe('EmptyActivity', () => { 8 | it('should renders correctly with no subtitle', () => { 9 | expect( 10 | toJson(shallow()) 11 | ).toMatchSnapshot(); 12 | }); 13 | 14 | it('should renders correctly with a subtitle', () => { 15 | expect( 16 | toJson( 17 | shallow( 18 | 19 | ) 20 | ) 21 | ).toMatchSnapshot(); 22 | }); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/components/EmptyActivity/index.ts: -------------------------------------------------------------------------------- 1 | export * from './EmptyActivity'; 2 | -------------------------------------------------------------------------------- /src/components/FontelloIcon/FontelloIcon.ts: -------------------------------------------------------------------------------- 1 | import {createIconSetFromFontello} from 'react-native-vector-icons'; 2 | // tslint:disable-next-line:no-var-requires 3 | const fontelloConfig = require('./config.json'); 4 | export const FontelloIcon = createIconSetFromFontello(fontelloConfig); 5 | -------------------------------------------------------------------------------- /src/components/FontelloIcon/fontello.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/components/FontelloIcon/fontello.ttf -------------------------------------------------------------------------------- /src/components/FontelloIcon/index.ts: -------------------------------------------------------------------------------- 1 | export * from './FontelloIcon'; 2 | -------------------------------------------------------------------------------- /src/components/LastTwoYearsStatistics/LastTwoYearsStatistics.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | container: { 5 | marginVertical: 15, 6 | flexDirection: 'row', 7 | alignItems: 'center', 8 | borderRadius: 3, 9 | borderColor: 'grey', 10 | borderWidth: 1 / PixelRatio.get(), 11 | }, 12 | leftContainer: { 13 | paddingHorizontal: 10, 14 | paddingVertical: 7, 15 | flex: 1, 16 | }, 17 | rightContainer: { 18 | paddingHorizontal: 10, 19 | paddingVertical: 7, 20 | flex: 1, 21 | borderColor: 'grey', 22 | borderLeftWidth: 1 / PixelRatio.get(), 23 | }, 24 | image: { 25 | marginHorizontal: 10, 26 | }, 27 | count: { 28 | fontSize: 25, 29 | }, 30 | text: { 31 | color: '#355974', 32 | }, 33 | }); 34 | -------------------------------------------------------------------------------- /src/components/LastTwoYearsStatistics/__tests__/LastTwoYearsStatistics.spec.tsx: -------------------------------------------------------------------------------- 1 | import {shallow} from 'enzyme'; 2 | import toJson from 'enzyme-to-json'; 3 | import React from 'react'; 4 | import {LastTwoYearsStatistics} from '../LastTwoYearsStatistics'; 5 | 6 | describe('Components', () => { 7 | describe('LastTwoYearsStatistics', () => { 8 | it('should renders correctly', () => { 9 | expect( 10 | toJson( 11 | shallow( 12 | 19 | ) 20 | ) 21 | ).toMatchSnapshot(); 22 | }); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/components/LastTwoYearsStatistics/index.ts: -------------------------------------------------------------------------------- 1 | export * from './LastTwoYearsStatistics'; 2 | -------------------------------------------------------------------------------- /src/components/ListItem/ListItem.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | row: { 5 | flexDirection: 'row', 6 | paddingVertical: 10, 7 | }, 8 | notLastRow: { 9 | borderBottomColor: '#96A5B3', 10 | borderBottomWidth: 1 / PixelRatio.get(), 11 | }, 12 | typeText: { 13 | marginLeft: 2, 14 | color: '#96A5B3', 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /src/components/ListItem/ListItem.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | import {Text, View} from 'react-native'; 3 | 4 | import {commonStyles} from '@theme'; 5 | import {styles} from './ListItem.styles'; 6 | 7 | interface IListItemProps { 8 | title: string; 9 | subtitle?: string; 10 | infoRight?: string; 11 | lastItem?: boolean; 12 | } 13 | 14 | export class ListItem extends PureComponent { 15 | public render() { 16 | const {title, infoRight, subtitle, lastItem} = this.props; 17 | 18 | return ( 19 | 20 | {title} 21 | {subtitle && {subtitle}} 22 | {infoRight && } 23 | {infoRight && {infoRight}} 24 | 25 | ); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/components/ListItem/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ListItem'; 2 | -------------------------------------------------------------------------------- /src/components/Navbar/Navbar.props.ts: -------------------------------------------------------------------------------- 1 | import {ReactNode} from 'react'; 2 | 3 | export interface INavbarProps { 4 | title: string | ReactNode; 5 | onBack?: any; 6 | rightTitle?: string; 7 | rightAction?: (...args) => void; 8 | rightIcon?: string; 9 | } 10 | -------------------------------------------------------------------------------- /src/components/Navbar/Navbar.styles.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | import {contraintTop} from '@theme'; 4 | 5 | export const styles = StyleSheet.create({ 6 | navbar: { 7 | marginTop: contraintTop, 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /src/components/Navbar/__tests__/Navbar.ios.spec.tsx: -------------------------------------------------------------------------------- 1 | import {shallow} from 'enzyme'; 2 | import toJson from 'enzyme-to-json'; 3 | import React from 'react'; 4 | import {View} from 'react-native'; 5 | import {Navbar} from '../Navbar.ios'; 6 | 7 | describe('Components', () => { 8 | describe('Navbar IOS', () => { 9 | const onPress = jest.fn(); 10 | 11 | it('should renders correctly', () => { 12 | expect( 13 | toJson(shallow()) 14 | ).toMatchSnapshot(); 15 | 16 | expect(toJson(shallow())).toMatchSnapshot(); 17 | expect(toJson(shallow(} />))).toMatchSnapshot(); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /src/components/Navbar/__tests__/__snapshots__/Navbar.android.spec.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Components Navbar Android should renders correctly 1`] = ` 4 | 19 | `; 20 | 21 | exports[`Components Navbar Android should renders correctly 2`] = ` 22 | 36 | `; 37 | -------------------------------------------------------------------------------- /src/components/Navbar/__tests__/index.android.spec.ts: -------------------------------------------------------------------------------- 1 | import {Navbar} from '../index'; 2 | 3 | jest.mock('../Navbar.android', () => ({Navbar: 'android'})); 4 | jest.mock('../Navbar.ios', () => ({Navbar: 'ios'})); 5 | 6 | jest.mock('react-native', () => ({ 7 | Platform: { 8 | OS: 'android', 9 | }, 10 | })); 11 | jest.mock('react-native-vector-icons/MaterialIcons'); 12 | 13 | describe('Components', () => { 14 | describe('Navbar Index', () => { 15 | describe('android', () => { 16 | it('should return the android version', () => { 17 | expect(Navbar).toBe('android'); 18 | }); 19 | }); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/components/Navbar/__tests__/index.ios.spec.ts: -------------------------------------------------------------------------------- 1 | import {Navbar} from '../index'; 2 | 3 | jest.mock('../Navbar.android', () => ({Navbar: 'android'})); 4 | jest.mock('../Navbar.ios', () => ({Navbar: 'ios'})); 5 | 6 | jest.mock('react-native', () => ({ 7 | Platform: { 8 | OS: 'ios', 9 | }, 10 | })); 11 | 12 | describe('Components', () => { 13 | describe('Navbar Index', () => { 14 | describe('ios', () => { 15 | it('should return the ios version', () => { 16 | expect(Navbar).toBe('ios'); 17 | }); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /src/components/Navbar/back/NavbarIOSBack.styles.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | leftButton: { 5 | flexDirection: 'row', 6 | alignItems: 'center', 7 | paddingLeft: 12, 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /src/components/Navbar/back/NavbarIOSBack.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | import {TouchableOpacity} from 'react-native'; 3 | import Icon from 'react-native-vector-icons/Ionicons'; 4 | 5 | import {hitSlop} from '@theme'; 6 | import {styles} from './NavbarIOSBack.styles'; 7 | 8 | interface INavbarIOSBackProps { 9 | onPress: (...args) => any; 10 | } 11 | 12 | export class NavbarIOSBack extends PureComponent { 13 | public render() { 14 | const {onPress} = this.props; 15 | 16 | return ( 17 | 22 | 23 | 24 | ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/components/Navbar/back/__tests__/NavbarIOSBack.spec.tsx: -------------------------------------------------------------------------------- 1 | import {shallow} from 'enzyme'; 2 | import toJson from 'enzyme-to-json'; 3 | import React from 'react'; 4 | import {NavbarIOSBack} from '../NavbarIOSBack'; 5 | 6 | describe('Components', () => { 7 | describe('NavbarIOSBack', () => { 8 | const onPress = jest.fn(); 9 | it('should renders correctly', () => { 10 | expect( 11 | toJson(shallow()) 12 | ).toMatchSnapshot(); 13 | }); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/components/Navbar/back/__tests__/__snapshots__/NavbarIOSBack.spec.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Components NavbarIOSBack should renders correctly 1`] = ` 4 | 23 | 29 | 30 | `; 31 | -------------------------------------------------------------------------------- /src/components/Navbar/index.ts: -------------------------------------------------------------------------------- 1 | import {Platform} from 'react-native'; 2 | import {Navbar as NavbarAndroid} from './Navbar.android'; 3 | import {Navbar as NavbarIOS} from './Navbar.ios'; 4 | 5 | export const Navbar = Platform.OS === 'ios' ? NavbarIOS : NavbarAndroid; 6 | -------------------------------------------------------------------------------- /src/components/Tabbar/Tabbar.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | import {contraintBottom} from '@theme'; 4 | export const textColor = '#8d8d8d'; 5 | export const activeTextColor = '#1361cb'; 6 | export const iconSize = 25; 7 | 8 | export const styles = StyleSheet.create({ 9 | tabContainer: { 10 | flexDirection: 'row', 11 | height: 48 + contraintBottom, 12 | paddingBottom: contraintBottom, 13 | backgroundColor: '#F8F7F7', 14 | borderColor: '#979797', 15 | borderTopWidth: 1 / PixelRatio.get(), 16 | }, 17 | tab: { 18 | flex: 1, 19 | alignItems: 'center', 20 | justifyContent: 'center', 21 | padding: 4, 22 | }, 23 | text: { 24 | fontSize: 10, 25 | color: textColor, 26 | }, 27 | textActive: { 28 | color: activeTextColor, 29 | }, 30 | }); 31 | -------------------------------------------------------------------------------- /src/components/Touchable/Touchable.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | import { 3 | Platform, 4 | TouchableNativeFeedback, 5 | TouchableOpacity, 6 | View, 7 | ViewStyle, 8 | } from 'react-native'; 9 | 10 | interface ITouchableProps { 11 | style?: ViewStyle; 12 | onPress: (...args) => any; 13 | children; 14 | } 15 | 16 | export class Touchable extends PureComponent { 17 | public render() { 18 | const {style, onPress, children} = this.props; 19 | return Platform.OS === 'ios' ? ( 20 | 21 | {children} 22 | 23 | ) : ( 24 | 25 | {children} 26 | 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/components/Touchable/__tests__/__snapshots__/Touchable.spec.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Components Touchable android should renders correctly 1`] = ` 4 | 7 | 8 | 9 | 10 | 11 | `; 12 | 13 | exports[`Components Touchable ios should renders correctly 1`] = ` 14 | 18 | 19 | 20 | 21 | `; 22 | -------------------------------------------------------------------------------- /src/components/Touchable/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Touchable'; 2 | -------------------------------------------------------------------------------- /src/components/form/ContactChooser/ContactChooser.styles.ts: -------------------------------------------------------------------------------- 1 | import {primaryColor} from '@theme'; 2 | import {StyleSheet} from 'react-native'; 3 | 4 | export const borderColor = '#b5b5b5'; 5 | 6 | const height = 30; 7 | 8 | export const styles = StyleSheet.create({ 9 | container: { 10 | flexDirection: 'row', 11 | height, 12 | alignItems: 'center', 13 | }, 14 | title: { 15 | flex: 1, 16 | flexDirection: 'row', 17 | height, 18 | alignItems: 'center', 19 | }, 20 | errorText: { 21 | color: 'red', 22 | }, 23 | contactName: { 24 | marginLeft: 10, 25 | flex: 1, 26 | }, 27 | edit: { 28 | color: primaryColor, 29 | }, 30 | }); 31 | -------------------------------------------------------------------------------- /src/components/form/ContactChooser/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ContactChooser'; 2 | -------------------------------------------------------------------------------- /src/components/form/FormListItem/FormListItem.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | export const borderColor = '#b5b5b5'; 4 | 5 | export const styles = StyleSheet.create({ 6 | container: { 7 | paddingVertical: 15, 8 | paddingHorizontal: 15, 9 | borderColor, 10 | borderBottomWidth: 1 / PixelRatio.get(), 11 | width: '100%', 12 | }, 13 | last: { 14 | borderBottomWidth: 0, 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /src/components/form/FormListItem/FormListItem.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | import {View} from 'react-native'; 3 | 4 | import {styles} from './FormListItem.styles'; 5 | 6 | interface IFormListItemProps { 7 | last?: boolean; 8 | } 9 | 10 | export class FormListItem extends PureComponent { 11 | public static defaultProps = { 12 | last: false, 13 | }; 14 | public render() { 15 | const {children, last} = this.props; 16 | 17 | return ( 18 | 19 | {children} 20 | 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/components/form/FormListItem/index.ts: -------------------------------------------------------------------------------- 1 | export * from './FormListItem'; 2 | -------------------------------------------------------------------------------- /src/components/form/Switch/Switch.styles.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const borderColor = '#b5b5b5'; 4 | 5 | const height = 30; 6 | 7 | export const styles = StyleSheet.create({ 8 | container: { 9 | flexDirection: 'row', 10 | height, 11 | alignItems: 'center', 12 | }, 13 | title: { 14 | flex: 1, 15 | flexDirection: 'row', 16 | height, 17 | alignItems: 'center', 18 | }, 19 | errorText: { 20 | color: 'red', 21 | }, 22 | }); 23 | -------------------------------------------------------------------------------- /src/components/form/Switch/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Switch'; 2 | -------------------------------------------------------------------------------- /src/components/form/TextInput/TextInput.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, Platform, StyleSheet} from 'react-native'; 2 | 3 | export const borderColor = '#b5b5b5'; 4 | 5 | export const styles = StyleSheet.create({ 6 | flexRow: { 7 | flexDirection: 'row', 8 | }, 9 | title: { 10 | width: '100%', 11 | flexDirection: 'row', 12 | }, 13 | errorText: { 14 | width: '100%', 15 | color: 'red', 16 | }, 17 | textInput: { 18 | height: 40, 19 | width: '100%', 20 | borderColor, 21 | borderBottomWidth: Platform.OS === 'ios' ? 1 / PixelRatio.get() : 0, 22 | marginBottom: 20, 23 | }, 24 | titleMultine: { 25 | fontSize: 11, 26 | }, 27 | }); 28 | -------------------------------------------------------------------------------- /src/components/form/TextInput/__tests__/TextInput.styles.android.spec.ts: -------------------------------------------------------------------------------- 1 | import {styles} from '../TextInput.styles'; 2 | 3 | jest.mock('Platform', () => ({ 4 | OS: 'android', 5 | })); 6 | 7 | describe('Components', () => { 8 | describe('TextInputStyles', () => { 9 | it('android should renders correctly', () => { 10 | expect((styles.textInput as any).borderBottomWidth).toEqual(0); 11 | }); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /src/components/form/TextInput/__tests__/TextInput.styles.ios.spec.ts: -------------------------------------------------------------------------------- 1 | import {styles} from '../TextInput.styles'; 2 | 3 | jest.mock('Platform', () => ({ 4 | OS: 'ios', 5 | })); 6 | 7 | describe('Components', () => { 8 | describe('TextInputStyles', () => { 9 | it('ios should renders correctly', () => { 10 | expect((styles.textInput as any).borderBottomWidth).toEqual(0.5); 11 | }); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /src/components/form/TextInput/index.ts: -------------------------------------------------------------------------------- 1 | export * from './TextInput'; 2 | -------------------------------------------------------------------------------- /src/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Button'; 2 | export * from './Back'; 3 | export * from './BottomNav'; 4 | export * from './ContactListItem'; 5 | export * from './Navbar'; 6 | export * from './Navbar/back/NavbarIOSBack'; 7 | export * from './ContactAvatar'; 8 | export * from './Touchable'; 9 | export * from './FontelloIcon'; 10 | export * from './EmptyActivity'; 11 | export * from './Checkbox'; 12 | export * from './LastTwoYearsStatistics'; 13 | export * from './ListItem'; 14 | export * from './form/Switch'; 15 | export * from './form/TextInput'; 16 | export * from './form/FormListItem'; 17 | export * from './form/ContactChooser'; 18 | -------------------------------------------------------------------------------- /src/components/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@components" 3 | } 4 | -------------------------------------------------------------------------------- /src/containers/ActionSheet/ActionSheetContainer.ts: -------------------------------------------------------------------------------- 1 | import {connect} from 'react-redux'; 2 | 3 | import {navigate} from '@navigator/NavigationService'; 4 | import {ActionSheet} from './ActionSheet'; 5 | 6 | export const ActionSheetContainer = connect( 7 | null, 8 | dispatch => ({ 9 | navigate: routeName => navigate(routeName), 10 | }), 11 | null, 12 | {withRef: true} 13 | )(ActionSheet); 14 | -------------------------------------------------------------------------------- /src/containers/ActionSheet/index.ts: -------------------------------------------------------------------------------- 1 | export {ActionSheetContainer as ActionSheet} from './ActionSheetContainer'; 2 | -------------------------------------------------------------------------------- /src/containers/CodePush/CodePushContainer.tsx: -------------------------------------------------------------------------------- 1 | import {connect} from 'react-redux'; 2 | 3 | import {IRootState} from '@models'; 4 | import {CodePush} from './CodePush'; 5 | 6 | export const CodePushContainer = connect((state: IRootState) => ({ 7 | beta: state.beta, 8 | }))(CodePush); 9 | -------------------------------------------------------------------------------- /src/containers/Contacts/Contacts.styles.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | header: { 5 | marginVertical: 10, 6 | flexDirection: 'row', 7 | paddingHorizontal: 5, 8 | }, 9 | headerCentered: { 10 | alignSelf: 'center', 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /src/containers/Contacts/ContactsContainer.ts: -------------------------------------------------------------------------------- 1 | import {IRootState} from '@redux/rootReducer'; 2 | import {connect} from 'react-redux'; 3 | 4 | import {getContacts, searchContacts} from '@redux/contacts'; 5 | import {Contacts} from './Contacts'; 6 | 7 | export const ContactsContainer = connect( 8 | (state: IRootState) => { 9 | const isSearching = state.searchContacts.query !== ''; 10 | const obj = isSearching ? state.searchContacts : state.getAllContacts; 11 | 12 | return { 13 | isSearching, 14 | contacts: obj.items.map(item => state.contacts[item]), 15 | isFetching: obj.isFetching, 16 | count: obj.count, 17 | }; 18 | }, 19 | dispatch => { 20 | return { 21 | getContacts: () => dispatch(getContacts()), 22 | searchContacts: query => dispatch(searchContacts(query)), 23 | }; 24 | } 25 | )(Contacts); 26 | -------------------------------------------------------------------------------- /src/containers/Contacts/Navbar/Navbar.props.ts: -------------------------------------------------------------------------------- 1 | export interface INavbarProps { 2 | onSearchTextChanged: (query) => void; 3 | onBack?: (...args) => any; 4 | } 5 | -------------------------------------------------------------------------------- /src/containers/Contacts/Navbar/Navbar.styles.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | import {contraintTop} from '@theme'; 4 | 5 | export const styles = StyleSheet.create({ 6 | navbar: { 7 | marginTop: contraintTop, 8 | }, 9 | navbarLogo: { 10 | marginTop: 7, 11 | marginLeft: 8, 12 | }, 13 | searchBar: { 14 | width: 245, 15 | height: 35, 16 | marginTop: 4, 17 | }, 18 | }); 19 | -------------------------------------------------------------------------------- /src/containers/Contacts/Navbar/Navbar.ts: -------------------------------------------------------------------------------- 1 | import {Platform} from 'react-native'; 2 | import {Navbar as NavbarAndroid} from './Navbar.android'; 3 | import {Navbar as NavbarIOS} from './Navbar.ios'; 4 | 5 | export const Navbar = Platform.OS === 'ios' ? NavbarIOS : NavbarAndroid; 6 | -------------------------------------------------------------------------------- /src/containers/Contacts/assets/no-contacts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/containers/Contacts/assets/no-contacts.png -------------------------------------------------------------------------------- /src/containers/Contacts/assets/no-contacts@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/containers/Contacts/assets/no-contacts@2x.png -------------------------------------------------------------------------------- /src/containers/Contacts/assets/no-contacts@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/containers/Contacts/assets/no-contacts@3x.png -------------------------------------------------------------------------------- /src/containers/Contacts/assets/no-results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/containers/Contacts/assets/no-results.png -------------------------------------------------------------------------------- /src/containers/Contacts/assets/no-results@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/containers/Contacts/assets/no-results@2x.png -------------------------------------------------------------------------------- /src/containers/Contacts/assets/no-results@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/containers/Contacts/assets/no-results@3x.png -------------------------------------------------------------------------------- /src/containers/InitialState/InitialStateContainer.ts: -------------------------------------------------------------------------------- 1 | import {connect, MapDispatchToProps} from 'react-redux'; 2 | 3 | import {navigate} from '@navigator/NavigationService'; 4 | import {subscribeBeta} from '@redux/beta'; 5 | import {getContacts} from '@redux/contacts'; 6 | import {setToken} from '@redux/user'; 7 | import {InitialState} from './InitialState'; 8 | 9 | export const InitialStateContainer = connect( 10 | null, 11 | // TODO 12 | (dispatch: MapDispatchToProps) => ({ 13 | navigate: routeName => navigate(routeName), 14 | setToken: token => dispatch(setToken(token)), 15 | getContacts: () => dispatch(getContacts()), 16 | subscribeBeta: isSubscribed => dispatch(subscribeBeta(isSubscribed)), 17 | }) 18 | )(InitialState); 19 | -------------------------------------------------------------------------------- /src/i18n/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import moment from 'moment'; 3 | import DeviceInfo from 'react-native-device-info'; 4 | 5 | import en from './locales/en'; 6 | import fr from './locales/fr'; 7 | 8 | import 'moment/src/locale/fr'; 9 | 10 | const locale = DeviceInfo.getDeviceLocale(); 11 | moment.locale([locale, 'en']); 12 | 13 | i18next.init({ 14 | lng: locale, 15 | fallbackLng: 'en', 16 | resources: {en, fr}, 17 | // @ts-ignore TODO Fix this 18 | debug: __DEV__ && !(global as any).jest, 19 | }); 20 | 21 | export const I18n = i18next; 22 | -------------------------------------------------------------------------------- /src/i18n/locales/en/activities.ts: -------------------------------------------------------------------------------- 1 | export const activities = { 2 | activities: 'Activities', 3 | emptyTitle: 'Have you done an activity with {{name}} lately?', 4 | emptySubtitle: 'Keep track of what you’ve done.', 5 | }; 6 | -------------------------------------------------------------------------------- /src/i18n/locales/en/auth.ts: -------------------------------------------------------------------------------- 1 | export const auth = { 2 | launch1: `Keep track of every interaction with your friend and family!`, 3 | launch2: `Remember when you last called, what you talked about, the name of their kids or what they prefer to eat!`, 4 | signinTitle: `Sign in with your account`, 5 | yourEmail: 'Your email', 6 | emailPlaceholder: 'email@example.com', 7 | yourPassword: 'Your password', 8 | signin: 'Sign in', 9 | signinIn: 'Signin in', 10 | badCredentials: 'Bad credentials', 11 | }; 12 | -------------------------------------------------------------------------------- /src/i18n/locales/en/calls.ts: -------------------------------------------------------------------------------- 1 | export const calls = { 2 | calls: 'Phone calls', 3 | emptyTitle: 'Enter details about phone calls you make.', 4 | emptySubtitle: 'So you can refer to it at a later time.', 5 | }; 6 | -------------------------------------------------------------------------------- /src/i18n/locales/en/common.ts: -------------------------------------------------------------------------------- 1 | export const common = { 2 | search: 'Search', 3 | lastUpdated: 'Last updated on {{- date}}', 4 | dashboard: 'Dashboard', 5 | add: 'Add', 6 | journal: 'Journal', 7 | settings: 'Settings', 8 | cancel: 'Cancel', 9 | yearDisplay: 'In {{year}}', 10 | getstarted: 'Get started', 11 | yourMonicaUrl: 'Your Monica server url', 12 | edit: 'Edit', 13 | 14 | form: { 15 | required: 'Is required', 16 | invalid: 'Is invalid', 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /src/i18n/locales/en/contacts.ts: -------------------------------------------------------------------------------- 1 | export const contacts = { 2 | contacts: 'Contacts', 3 | countHeader: { 4 | before: 'You have', 5 | after: 'contact', 6 | after_plural: 'contacts', 7 | }, 8 | 9 | age: '{{age}} years old', 10 | add: 'Add a contact', 11 | none: 'No contact found.', 12 | addOne: 'To add your first contact, use the “+” button below.', 13 | search: 'Search your contacts', 14 | 15 | relationships: { 16 | relationships: 'Relationships', 17 | relations: 'Relations', 18 | none: 'No relationship', 19 | }, 20 | meet: { 21 | how: 'How you met', 22 | through: 'Met through {{name}}', 23 | none: 'No meet information', 24 | }, 25 | work: { 26 | work: 'Work info', 27 | none: 'No work information', 28 | }, 29 | contact: { 30 | contact: 'Contact', 31 | none: 'No contact information', 32 | }, 33 | 34 | chooser: { 35 | noContact: 'No contact', 36 | }, 37 | }; 38 | -------------------------------------------------------------------------------- /src/i18n/locales/en/debts.ts: -------------------------------------------------------------------------------- 1 | export const debts = { 2 | debts: 'Debts', 3 | youOwe: 'You owe', 4 | owesYou: '{{name}} owes you', 5 | emptyTitle: 'Money doesn’t buy happiness.', 6 | emptySubtitle: 7 | 'But having no debts that you owe is a way to stay happy in your friendship.', 8 | }; 9 | -------------------------------------------------------------------------------- /src/i18n/locales/en/gifts.ts: -------------------------------------------------------------------------------- 1 | export const gifts = { 2 | gifts: 'Gifts', 3 | offered: 'offered', 4 | idea: 'idea', 5 | emptyTitle: 6 | 'Is there a better way to show how much you appreciate someone than to offer a gift?', 7 | emptySubtitle: 'Yes, there is. But a gift is still a nice touch.', 8 | }; 9 | -------------------------------------------------------------------------------- /src/i18n/locales/en/index.ts: -------------------------------------------------------------------------------- 1 | import {activities} from './activities'; 2 | import {auth} from './auth'; 3 | import {calls} from './calls'; 4 | import {common} from './common'; 5 | import {contacts} from './contacts'; 6 | import {debts} from './debts'; 7 | import {gifts} from './gifts'; 8 | import {notes} from './notes'; 9 | import {reminders} from './reminders'; 10 | import {settings} from './settings'; 11 | import {tasks} from './tasks'; 12 | 13 | export default { 14 | activities, 15 | auth, 16 | calls, 17 | common, 18 | contacts, 19 | debts, 20 | gifts, 21 | notes, 22 | reminders, 23 | tasks, 24 | settings, 25 | }; 26 | -------------------------------------------------------------------------------- /src/i18n/locales/en/notes.ts: -------------------------------------------------------------------------------- 1 | export const notes = { 2 | notes: 'Notes', 3 | edit: 'Edit a note', 4 | add: 'Add a note', 5 | emptyTitle: 'Notes are great to record precious details about your contacts.', 6 | emptySubtitle: 'Just write down what you have in mind.', 7 | save: 'Done', 8 | chooseContact: 'Choose a contact for this note', 9 | form: { 10 | body: 'Content', 11 | is_favorited: 'Favorite', 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /src/i18n/locales/en/reminders.ts: -------------------------------------------------------------------------------- 1 | export const reminders = { 2 | reminders: 'Reminders', 3 | emptyTitle: 'Be reminded at the right time, for things that matter.', 4 | emptySubtitle: 'Your memory might let you down - we won’t.', 5 | frequency: { 6 | year: 'every year', 7 | month: 'every month', 8 | day: 'every day', 9 | one_time: 'one time', 10 | }, 11 | }; 12 | -------------------------------------------------------------------------------- /src/i18n/locales/en/settings.ts: -------------------------------------------------------------------------------- 1 | export const settings = { 2 | settings: 'Settings', 3 | betaInstall: 'Enable advanced features.', 4 | betaInstallExplanation: `If enabled, you'll have access to features reserved for users with a deep knowledge of how Monica works.`, 5 | version: 'Version: {{version}}', 6 | logout: 'Logout', 7 | freepik1: 'Most illustrations used in this app come from Freepik', 8 | freepik2: 'Designed by freepik.com', 9 | }; 10 | -------------------------------------------------------------------------------- /src/i18n/locales/en/tasks.ts: -------------------------------------------------------------------------------- 1 | export const tasks = { 2 | tasks: 'Tasks', 3 | emptyTitle: 'You have no excuses not to be multitask anymore.', 4 | emptySubtitle: 'Let Monica manage stuff for you.', 5 | }; 6 | -------------------------------------------------------------------------------- /src/i18n/locales/fr/activities.ts: -------------------------------------------------------------------------------- 1 | export const activities = { 2 | activities: 'Activités', 3 | }; 4 | -------------------------------------------------------------------------------- /src/i18n/locales/fr/auth.ts: -------------------------------------------------------------------------------- 1 | export const auth = {}; 2 | -------------------------------------------------------------------------------- /src/i18n/locales/fr/calls.ts: -------------------------------------------------------------------------------- 1 | export const calls = {}; 2 | -------------------------------------------------------------------------------- /src/i18n/locales/fr/common.ts: -------------------------------------------------------------------------------- 1 | export const common = {}; 2 | -------------------------------------------------------------------------------- /src/i18n/locales/fr/contacts.ts: -------------------------------------------------------------------------------- 1 | export const contacts = {}; 2 | -------------------------------------------------------------------------------- /src/i18n/locales/fr/debts.ts: -------------------------------------------------------------------------------- 1 | export const debts = {}; 2 | -------------------------------------------------------------------------------- /src/i18n/locales/fr/gifts.ts: -------------------------------------------------------------------------------- 1 | export const gifts = {}; 2 | -------------------------------------------------------------------------------- /src/i18n/locales/fr/index.ts: -------------------------------------------------------------------------------- 1 | import {activities} from './activities'; 2 | import {auth} from './auth'; 3 | import {calls} from './calls'; 4 | import {common} from './common'; 5 | import {contacts} from './contacts'; 6 | import {debts} from './debts'; 7 | import {gifts} from './gifts'; 8 | import {notes} from './notes'; 9 | import {reminders} from './reminders'; 10 | import {settings} from './settings'; 11 | import {tasks} from './tasks'; 12 | 13 | export default { 14 | activities, 15 | auth, 16 | calls, 17 | common, 18 | contacts, 19 | debts, 20 | gifts, 21 | notes, 22 | reminders, 23 | tasks, 24 | settings, 25 | }; 26 | -------------------------------------------------------------------------------- /src/i18n/locales/fr/notes.ts: -------------------------------------------------------------------------------- 1 | export const notes = {}; 2 | -------------------------------------------------------------------------------- /src/i18n/locales/fr/reminders.ts: -------------------------------------------------------------------------------- 1 | export const reminders = {}; 2 | -------------------------------------------------------------------------------- /src/i18n/locales/fr/settings.ts: -------------------------------------------------------------------------------- 1 | export const settings = {}; 2 | -------------------------------------------------------------------------------- /src/i18n/locales/fr/tasks.ts: -------------------------------------------------------------------------------- 1 | export const tasks = {}; 2 | -------------------------------------------------------------------------------- /src/i18n/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@i18n" 3 | } 4 | -------------------------------------------------------------------------------- /src/models/actions.ts: -------------------------------------------------------------------------------- 1 | import {ActionType} from 'typesafe-actions'; 2 | 3 | import * as activitiesActions from '@redux/activities/actions'; 4 | import * as betaActions from '@redux/beta/actions'; 5 | import * as callsActions from '@redux/calls/actions'; 6 | 7 | import * as contactsActions from '@redux/contacts/actions'; 8 | import * as debtsActions from '@redux/debts/actions'; 9 | import * as giftsActions from '@redux/gifts/actions'; 10 | import * as notesActions from '@redux/notes/actions'; 11 | import * as remindersActions from '@redux/reminders/actions'; 12 | import * as tasksActions from '@redux/tasks/actions'; 13 | import * as userActions from '@redux/user/actions'; 14 | 15 | const actions = { 16 | activitiesActions, 17 | betaActions, 18 | callsActions, 19 | contactsActions, 20 | debtsActions, 21 | giftsActions, 22 | notesActions, 23 | remindersActions, 24 | tasksActions, 25 | userActions, 26 | }; 27 | 28 | export type IRootAction = ActionType; 29 | -------------------------------------------------------------------------------- /src/models/activity.ts: -------------------------------------------------------------------------------- 1 | export interface IActivity { 2 | id: number; 3 | /** The name of the activity */ 4 | summary: string; 5 | date_it_happened: string; 6 | /** An optional comment */ 7 | description: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/models/call.ts: -------------------------------------------------------------------------------- 1 | export interface ICall { 2 | id: number; 3 | called_at: string; 4 | content: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/models/debt.ts: -------------------------------------------------------------------------------- 1 | import {IContact} from '@models'; 2 | 3 | export interface IDebt { 4 | id: number; 5 | amount: number; 6 | contact: IContact; 7 | in_debt: 'yes' | 'no'; 8 | reason: string; 9 | } 10 | -------------------------------------------------------------------------------- /src/models/gift.ts: -------------------------------------------------------------------------------- 1 | export interface IGift { 2 | id: number; 3 | name: string; 4 | has_been_offered: boolean; 5 | is_an_idea: boolean; 6 | description: string; 7 | } 8 | -------------------------------------------------------------------------------- /src/models/index.ts: -------------------------------------------------------------------------------- 1 | export {IRootState} from '@redux/rootReducer'; 2 | export {IRootAction} from './actions'; 3 | export * from './contact'; 4 | export * from './activity'; 5 | export * from './call'; 6 | export * from './debt'; 7 | export * from './gift'; 8 | export * from './note'; 9 | export * from './reminder'; 10 | export * from './task'; 11 | 12 | export interface IPageCountByContact { 13 | [contactId: number]: number; 14 | } 15 | 16 | export interface IMetaStatistics { 17 | [year: string]: number; 18 | } 19 | -------------------------------------------------------------------------------- /src/models/note.ts: -------------------------------------------------------------------------------- 1 | import {IContact} from '@models'; 2 | 3 | export interface INote { 4 | id: number; 5 | created_at: string; 6 | body: string; 7 | contact: IContact; 8 | is_favorited: boolean; 9 | } 10 | -------------------------------------------------------------------------------- /src/models/operations.ts: -------------------------------------------------------------------------------- 1 | export {IBetaSubscribeOperation} from '@redux/beta'; 2 | export {IUserLogoutOperation, IUserSetTokenOperation} from '@redux/user'; 3 | export {IContactsGetOperation, IContactsSearchOperation} from '@redux/contacts'; 4 | export {IActivitiesGetByContactOperation} from '@redux/activities'; 5 | export {ICallsGetByContactOperation} from '@redux/calls'; 6 | export {IDebtsGetByContactOperation} from '@redux/debts'; 7 | export {IGiftsGetByContactOperation} from '@redux/gifts'; 8 | export {INotesGetByContactOperation} from '@redux/notes'; 9 | export {IRemindersGetByContactOperation} from '@redux/reminders'; 10 | export {ITasksGetByContactOperation} from '@redux/tasks'; 11 | -------------------------------------------------------------------------------- /src/models/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@models" 3 | } 4 | -------------------------------------------------------------------------------- /src/models/reminder.ts: -------------------------------------------------------------------------------- 1 | export interface IReminder { 2 | id: number; 3 | title: string; 4 | description: string; 5 | next_expected_date: string; 6 | frequency_type: 'one_time' | 'year' | 'month' | 'day'; 7 | } 8 | -------------------------------------------------------------------------------- /src/models/task.ts: -------------------------------------------------------------------------------- 1 | export interface ITask { 2 | id: number; 3 | title: string; 4 | description: string; 5 | completed: boolean; 6 | } 7 | -------------------------------------------------------------------------------- /src/navigator/AppNavigator.tsx: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import {createSwitchNavigator} from 'react-navigation'; 3 | 4 | import {InitialStateContainer} from '@src/containers/InitialState/InitialStateContainer'; 5 | import {setTopLevelNavigator} from './NavigationService'; 6 | 7 | import {AppStack} from './AppStack'; 8 | import {AuthStack} from './AuthStack'; 9 | 10 | export const SwitchNavigator = createSwitchNavigator( 11 | { 12 | AuthLoading: { 13 | screen: InitialStateContainer, 14 | }, 15 | Auth: AuthStack, 16 | App: AppStack, 17 | }, 18 | { 19 | initialRouteName: 'AuthLoading', 20 | } 21 | ); 22 | 23 | export class AppNavigator extends Component { 24 | public render() { 25 | return ( 26 | { 28 | setTopLevelNavigator(navigatorRef); 29 | }} 30 | /> 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/navigator/AuthStack.ts: -------------------------------------------------------------------------------- 1 | import {createStackNavigator} from 'react-navigation'; 2 | 3 | import {LaunchScreen} from '@src/pages/Auth/Launch/LaunchScreen'; 4 | import {LoginScreen} from '@src/pages/Auth/Login/LoginScreen'; 5 | 6 | export const AuthStack = createStackNavigator( 7 | { 8 | Launch: { 9 | screen: LaunchScreen, 10 | }, 11 | Login: { 12 | screen: LoginScreen, 13 | }, 14 | }, 15 | { 16 | navigationOptions: {header: null}, 17 | } 18 | ); 19 | -------------------------------------------------------------------------------- /src/navigator/NavigationService.ts: -------------------------------------------------------------------------------- 1 | import {NavigationActions, StackActions} from 'react-navigation'; 2 | 3 | let navigator; 4 | 5 | export const setTopLevelNavigator = navigatorRef => { 6 | navigator = navigatorRef; 7 | }; 8 | 9 | export const navigate = (routeName: string, params?: any) => { 10 | navigator.dispatch( 11 | NavigationActions.navigate({ 12 | routeName, 13 | params, 14 | }) 15 | ); 16 | }; 17 | 18 | export const pop = () => { 19 | navigator.dispatch(StackActions.pop()); 20 | }; 21 | 22 | export type INavigateAction = typeof navigate; 23 | export type IPopAction = typeof pop; 24 | -------------------------------------------------------------------------------- /src/navigator/TabsNavigator.ts: -------------------------------------------------------------------------------- 1 | import {createBottomTabNavigator} from 'react-navigation'; 2 | 3 | import {Tabbar} from '../components/Tabbar/Tabbar'; 4 | 5 | import {ContactsScreen} from '@src/pages/Contacts/ContactsScreen'; 6 | // import {DashboardScreen} from '@src/pages/DashboardScreen'; 7 | // import {JournalScreen} from '@src/pages/JournalScreen'; 8 | import {SettingsScreen} from '@src/pages/Settings/SettingsScreen'; 9 | 10 | export const TabsNavigator = createBottomTabNavigator( 11 | { 12 | // Dashboard: { 13 | // screen: DashboardScreen, 14 | // }, 15 | Contacts: { 16 | screen: ContactsScreen, 17 | }, 18 | // Journal: { 19 | // screen: JournalScreen, 20 | // }, 21 | Settings: { 22 | screen: SettingsScreen, 23 | }, 24 | }, 25 | { 26 | tabBarComponent: Tabbar, 27 | } 28 | ); 29 | -------------------------------------------------------------------------------- /src/navigator/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@navigator" 3 | } 4 | -------------------------------------------------------------------------------- /src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@src" 3 | } 4 | -------------------------------------------------------------------------------- /src/pages/AddContactScreen.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | import {View} from 'react-native'; 3 | import {connect} from 'react-redux'; 4 | 5 | import {Navbar} from '@components'; 6 | import {I18n} from '@i18n'; 7 | import {IPopAction, pop as popAction} from '@navigator/NavigationService'; 8 | import {appScreensStyles} from '@theme'; 9 | 10 | interface IAddContactProps { 11 | pop: IPopAction; 12 | } 13 | 14 | export class AddContact extends PureComponent { 15 | public render() { 16 | const {pop} = this.props; 17 | return ( 18 | 19 | 20 | 21 | ); 22 | } 23 | } 24 | 25 | export const AddContactScreen = connect( 26 | null, 27 | dispatch => ({ 28 | pop: () => popAction(), 29 | }) 30 | )(AddContact); 31 | -------------------------------------------------------------------------------- /src/pages/Auth/Launch/LaunchScreen.ts: -------------------------------------------------------------------------------- 1 | import {connect} from 'react-redux'; 2 | 3 | import {navigate} from '@navigator/NavigationService'; 4 | import {Launch} from './Launch'; 5 | 6 | export const LaunchScreen = connect( 7 | null, 8 | dispatch => { 9 | return { 10 | navigate: routeName => () => navigate(routeName), 11 | }; 12 | } 13 | )(Launch); 14 | -------------------------------------------------------------------------------- /src/pages/Auth/Launch/__tests__/Launch.spec.tsx: -------------------------------------------------------------------------------- 1 | import {shallow} from 'enzyme'; 2 | import toJson from 'enzyme-to-json'; 3 | import React from 'react'; 4 | import {Launch} from '../Launch'; 5 | 6 | const emptyFunc = () => () => { 7 | return; 8 | }; 9 | 10 | describe('Components', () => { 11 | describe('Launch', () => { 12 | it('should renders correctly', () => { 13 | const tree = shallow(); 14 | expect(toJson(tree)).toMatchSnapshot(); 15 | }); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /src/pages/Auth/Launch/assets/launch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Auth/Launch/assets/launch.png -------------------------------------------------------------------------------- /src/pages/Auth/Launch/assets/launch@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Auth/Launch/assets/launch@2x.png -------------------------------------------------------------------------------- /src/pages/Auth/Launch/assets/launch@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Auth/Launch/assets/launch@3x.png -------------------------------------------------------------------------------- /src/pages/Auth/Login/LoginScreen.ts: -------------------------------------------------------------------------------- 1 | import {connect} from 'react-redux'; 2 | 3 | import {navigate, pop} from '@navigator/NavigationService'; 4 | import {setToken} from '@redux/user'; 5 | import {Login} from './Login'; 6 | 7 | export const mapDispatchToProps = dispatch => { 8 | return { 9 | navigate: routeName => () => navigate(routeName), 10 | navigateToAppStack: () => navigate('App'), 11 | pop, 12 | setToken: token => dispatch(setToken(token)), 13 | }; 14 | }; 15 | 16 | export const LoginScreen = connect( 17 | null, 18 | mapDispatchToProps 19 | )(Login); 20 | -------------------------------------------------------------------------------- /src/pages/Auth/Login/assets/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Auth/Login/assets/login.png -------------------------------------------------------------------------------- /src/pages/Auth/Login/assets/login@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Auth/Login/assets/login@2x.png -------------------------------------------------------------------------------- /src/pages/Auth/Login/assets/login@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Auth/Login/assets/login@3x.png -------------------------------------------------------------------------------- /src/pages/Auth/Login/form/LoginForm.model.ts: -------------------------------------------------------------------------------- 1 | export interface IProps { 2 | onSuccess: (values: any) => void; 3 | } 4 | export interface IValues { 5 | email: string; 6 | password: string; 7 | url: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/pages/ChooseContacts/ChooseContacts.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | 3 | import {I18n} from '@i18n'; 4 | import {IContact} from '@models'; 5 | import {ContactsContainer} from '../../containers/Contacts/ContactsContainer'; 6 | 7 | interface IContactsProps { 8 | navigation: any; 9 | pop: any; 10 | } 11 | 12 | export class ChooseContacts extends PureComponent { 13 | public render() { 14 | const {pop} = this.props; 15 | 16 | return ( 17 | 22 | ); 23 | } 24 | 25 | private onPress = (contactId: IContact) => () => { 26 | const {navigation} = this.props; 27 | navigation.state.params.returnData(contactId); 28 | navigation.goBack(); 29 | }; 30 | } 31 | -------------------------------------------------------------------------------- /src/pages/ChooseContacts/ChooseContactsScreen.ts: -------------------------------------------------------------------------------- 1 | import {connect} from 'react-redux'; 2 | 3 | import {pop} from '@navigator/NavigationService'; 4 | import {ChooseContacts} from './ChooseContacts'; 5 | 6 | export const ChooseContactsScreen = connect( 7 | null, 8 | (dispatch, props) => { 9 | return { 10 | pop: () => pop(), 11 | }; 12 | } 13 | )(ChooseContacts); 14 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactActivityRow/ContactActivityRow.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | container: { 5 | flexDirection: 'row', 6 | height: 50, 7 | alignItems: 'center', 8 | }, 9 | image: { 10 | marginLeft: 5, 11 | marginRight: 10, 12 | }, 13 | border: { 14 | height: 1 / PixelRatio.get(), 15 | backgroundColor: '#E2E4E5', 16 | }, 17 | icon: { 18 | marginLeft: 10, 19 | }, 20 | }); 21 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactInfos/Contact.styles.tsx: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | container: { 5 | marginTop: 5, 6 | }, 7 | noInformation: { 8 | marginVertical: 30, 9 | textAlign: 'center', 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactInfos/Meet.styles.tsx: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | container: { 5 | marginTop: 5, 6 | }, 7 | noInformation: { 8 | marginVertical: 30, 9 | textAlign: 'center', 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactInfos/Relationships.styles.tsx: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | container: { 5 | marginTop: 5, 6 | }, 7 | noFamily: { 8 | marginVertical: 30, 9 | textAlign: 'center', 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactInfos/Work.styles.tsx: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | container: { 5 | marginTop: 5, 6 | }, 7 | noWorkInfo: { 8 | marginVertical: 30, 9 | textAlign: 'center', 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactInfos/__tests__/Contact.spec.tsx: -------------------------------------------------------------------------------- 1 | import {contact1} from '@src/__mock__/contact'; 2 | import {shallow} from 'enzyme'; 3 | import toJson from 'enzyme-to-json'; 4 | import React from 'react'; 5 | import {Contact} from '../Contact'; 6 | 7 | describe('Pages', () => { 8 | describe('Contact / Contact', () => { 9 | it('should renders correctly', () => { 10 | expect(toJson(shallow())).toMatchSnapshot(); 11 | }); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactInfos/__tests__/ContactInfos.spec.tsx: -------------------------------------------------------------------------------- 1 | import {contact1} from '@src/__mock__/contact'; 2 | import {shallow} from 'enzyme'; 3 | import toJson from 'enzyme-to-json'; 4 | import React from 'react'; 5 | import {ContactInfos} from '../ContactInfos'; 6 | 7 | describe('Pages', () => { 8 | describe('Contact / ContactInfos', () => { 9 | it('should renders correctly', () => { 10 | expect( 11 | toJson(shallow()) 12 | ).toMatchSnapshot(); 13 | }); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactInfos/__tests__/Meet.spec.tsx: -------------------------------------------------------------------------------- 1 | import {contact1} from '@src/__mock__/contact'; 2 | import {shallow} from 'enzyme'; 3 | import toJson from 'enzyme-to-json'; 4 | import React from 'react'; 5 | import {Meet} from '../Meet'; 6 | 7 | describe('Pages', () => { 8 | describe('Contact / Meet', () => { 9 | it('should renders correctly', () => { 10 | expect(toJson(shallow())).toMatchSnapshot(); 11 | }); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactInfos/__tests__/Relationships.spec.tsx: -------------------------------------------------------------------------------- 1 | import {contact1} from '@src/__mock__/contact'; 2 | import {shallow} from 'enzyme'; 3 | import toJson from 'enzyme-to-json'; 4 | import React from 'react'; 5 | import {Relationships} from '../Relationships'; 6 | 7 | describe('Pages', () => { 8 | describe('Contact / Relationships', () => { 9 | it('should renders correctly', () => { 10 | expect( 11 | toJson(shallow()) 12 | ).toMatchSnapshot(); 13 | }); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactInfos/__tests__/__snapshots__/Contact.spec.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Pages Contact / Contact should renders correctly 1`] = ` 4 | 11 | 16 | 21 | 22 | `; 23 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactInfos/__tests__/__snapshots__/Meet.spec.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Pages Contact / Meet should renders correctly 1`] = ` 4 | 11 | 16 | 21 | 22 | `; 23 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactInfos/__tests__/__snapshots__/Relationships.spec.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Pages Contact / Relationships should renders correctly 1`] = ` 4 | 11 | 19 | No relationship 20 | 21 | 22 | `; 23 | -------------------------------------------------------------------------------- /src/pages/Contact/ContactScreen.ts: -------------------------------------------------------------------------------- 1 | import {IRootState} from '@models'; 2 | import {connect, MapDispatchToProps} from 'react-redux'; 3 | 4 | import {navigate, pop} from '@navigator/NavigationService'; 5 | import {Contact} from './Contact'; 6 | 7 | export interface IContactProps { 8 | navigation: { 9 | state: { 10 | params: number; 11 | }; 12 | }; 13 | } 14 | 15 | export const ContactScreen = connect( 16 | (state: IRootState, props: IContactProps) => ({ 17 | contact: state.contacts[props.navigation.state.params], 18 | }), 19 | // TODO 20 | (dispatch: MapDispatchToProps) => ({ 21 | pop, 22 | navigate: (routeName, contactId) => () => navigate(routeName, contactId), 23 | }) 24 | )(Contact); 25 | -------------------------------------------------------------------------------- /src/pages/Contact/__tests__/Contact.spec.tsx: -------------------------------------------------------------------------------- 1 | import {shallow} from 'enzyme'; 2 | import React from 'react'; 3 | import {Contact} from '../Contact'; 4 | 5 | describe('Pages', () => { 6 | describe('Contact', () => { 7 | const pop = jest.fn(); 8 | const navigate = jest.fn(); 9 | navigate.mockReturnValue(jest.fn()); 10 | const contact = { 11 | statistics: { 12 | number_of_calls: 0, 13 | number_of_activities: 0, 14 | number_of_reminders: 0, 15 | number_of_tasks: 0, 16 | number_of_notes: 0, 17 | number_of_gifts: 0, 18 | number_of_debts: 0, 19 | }, 20 | }; 21 | 22 | it('should not have a componentWillReceiveProps method', () => { 23 | const tree = shallow( 24 | 25 | ); 26 | expect(tree.instance().componentWillMount).toBeUndefined(); 27 | }); 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /src/pages/Contacts/Contacts.tsx: -------------------------------------------------------------------------------- 1 | import React, {PureComponent} from 'react'; 2 | 3 | import {IContact} from '@models'; 4 | import {ContactsContainer} from '../../containers/Contacts/ContactsContainer'; 5 | 6 | interface IContactsProps { 7 | navigateToContact: (contact: IContact) => any; 8 | } 9 | 10 | export class Contacts extends PureComponent { 11 | public render() { 12 | const {navigateToContact} = this.props; 13 | 14 | return ; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/pages/Contacts/ContactsScreen.ts: -------------------------------------------------------------------------------- 1 | import {connect} from 'react-redux'; 2 | 3 | import {IContact} from '@models'; 4 | import {navigate} from '@navigator/NavigationService'; 5 | import {Contacts} from './Contacts'; 6 | 7 | export const ContactsScreen = connect( 8 | null, 9 | dispatch => { 10 | return { 11 | navigateToContact: (contact: IContact) => () => 12 | navigate('Contact', contact.id), 13 | }; 14 | } 15 | )(Contacts); 16 | -------------------------------------------------------------------------------- /src/pages/DashboardScreen.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {View} from 'react-native'; 3 | 4 | import {Navbar} from '@components'; 5 | import {I18n} from '@i18n'; 6 | import {appScreensStyles} from '@theme'; 7 | 8 | export const DashboardScreen = () => ( 9 | 10 | 11 | 12 | ); 13 | -------------------------------------------------------------------------------- /src/pages/Entities/Activities/List/ActivitiesList.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | headerContainer: { 5 | backgroundColor: 'white', 6 | paddingHorizontal: 15, 7 | }, 8 | activityContainer: { 9 | paddingVertical: 20, 10 | paddingHorizontal: 15, 11 | backgroundColor: 'white', 12 | borderColor: '#E2E4E5', 13 | borderBottomWidth: 1 / PixelRatio.get(), 14 | }, 15 | textLeft: { 16 | color: '#355974', 17 | }, 18 | textRight: { 19 | color: '#97A5B2', 20 | }, 21 | textInfo: { 22 | marginTop: 5, 23 | fontSize: 14, 24 | }, 25 | }); 26 | -------------------------------------------------------------------------------- /src/pages/Entities/Activities/List/assets/empty-activities.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Activities/List/assets/empty-activities.png -------------------------------------------------------------------------------- /src/pages/Entities/Activities/List/assets/empty-activities@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Activities/List/assets/empty-activities@2x.png -------------------------------------------------------------------------------- /src/pages/Entities/Activities/List/assets/empty-activities@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Activities/List/assets/empty-activities@3x.png -------------------------------------------------------------------------------- /src/pages/Entities/Calls/List/CallsList.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | headerContainer: { 5 | backgroundColor: 'white', 6 | paddingHorizontal: 15, 7 | }, 8 | callContainer: { 9 | paddingVertical: 20, 10 | paddingHorizontal: 15, 11 | backgroundColor: 'white', 12 | borderColor: '#E2E4E5', 13 | borderBottomWidth: 1 / PixelRatio.get(), 14 | }, 15 | textLeft: { 16 | color: '#355974', 17 | }, 18 | textRight: { 19 | color: '#97A5B2', 20 | }, 21 | textInfo: { 22 | marginTop: 5, 23 | fontSize: 14, 24 | }, 25 | }); 26 | -------------------------------------------------------------------------------- /src/pages/Entities/Calls/List/CallsListScreen.ts: -------------------------------------------------------------------------------- 1 | import {IRootState} from '@models'; 2 | import {connect} from 'react-redux'; 3 | 4 | import {pop} from '@navigator/NavigationService'; 5 | import {getCallsByContact} from '@redux/calls'; 6 | import {CallsList} from './CallsList'; 7 | 8 | export const mapStateToProps = (state: IRootState, {navigation}) => { 9 | const contact = state.contacts[navigation.state.params]; 10 | return { 11 | calls: (contact.calls || []).map(callId => state.calls[callId]), 12 | isFetching: state.getCallsByContact.isFetching, 13 | statistics: state.getCallsByContact.statistics, 14 | }; 15 | }; 16 | 17 | export const mapDispatchToProps = (dispatch, {navigation}) => ({ 18 | pop, 19 | getCallsByContact: () => dispatch(getCallsByContact(navigation.state.params)), 20 | }); 21 | 22 | export const CallsListScreen = connect( 23 | mapStateToProps, 24 | mapDispatchToProps 25 | )(CallsList); 26 | -------------------------------------------------------------------------------- /src/pages/Entities/Calls/List/assets/empty-calls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Calls/List/assets/empty-calls.png -------------------------------------------------------------------------------- /src/pages/Entities/Calls/List/assets/empty-calls@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Calls/List/assets/empty-calls@2x.png -------------------------------------------------------------------------------- /src/pages/Entities/Calls/List/assets/empty-calls@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Calls/List/assets/empty-calls@3x.png -------------------------------------------------------------------------------- /src/pages/Entities/Debts/List/DebtsList.styles.tsx: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | import {primaryColor} from '@theme'; 4 | 5 | export const styles = StyleSheet.create({ 6 | debtContainer: { 7 | paddingVertical: 20, 8 | paddingHorizontal: 15, 9 | backgroundColor: 'white', 10 | borderColor: '#E2E4E5', 11 | borderBottomWidth: 1 / PixelRatio.get(), 12 | }, 13 | headerContainer: { 14 | flexDirection: 'row', 15 | marginBottom: 10, 16 | }, 17 | badge: { 18 | paddingHorizontal: 5, 19 | paddingVertical: 2, 20 | borderRadius: 5, 21 | }, 22 | badgeText: { 23 | color: 'white', 24 | fontSize: 13, 25 | }, 26 | badgeSuccess: { 27 | backgroundColor: primaryColor, 28 | }, 29 | badgeError: { 30 | backgroundColor: 'red', 31 | }, 32 | amountText: { 33 | marginTop: 2, 34 | marginLeft: 6, 35 | }, 36 | reasonText: { 37 | fontSize: 13, 38 | }, 39 | }); 40 | -------------------------------------------------------------------------------- /src/pages/Entities/Debts/List/DebtsListScreen.tsx: -------------------------------------------------------------------------------- 1 | import {connect} from 'react-redux'; 2 | 3 | import {pop} from '@navigator/NavigationService'; 4 | import {getDebtsByContact} from '@redux/debts'; 5 | import {DebtsList} from './DebtsList'; 6 | 7 | export const mapStateToProps = (state, {navigation}) => { 8 | const contact = state.contacts[navigation.state.params]; 9 | return { 10 | debts: (contact.debts || []).map(noteId => state.debts[noteId]), 11 | isFetching: state.getDebtsByContact.isFetching, 12 | }; 13 | }; 14 | 15 | export const mapDispatchToProps = (dispatch, {navigation}) => ({ 16 | pop, 17 | getDebtsByContact: () => dispatch(getDebtsByContact(navigation.state.params)), 18 | }); 19 | 20 | export const DebtsListScreen = connect( 21 | mapStateToProps, 22 | mapDispatchToProps 23 | )(DebtsList); 24 | -------------------------------------------------------------------------------- /src/pages/Entities/Debts/List/assets/empty-debts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Debts/List/assets/empty-debts.png -------------------------------------------------------------------------------- /src/pages/Entities/Debts/List/assets/empty-debts@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Debts/List/assets/empty-debts@2x.png -------------------------------------------------------------------------------- /src/pages/Entities/Debts/List/assets/empty-debts@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Debts/List/assets/empty-debts@3x.png -------------------------------------------------------------------------------- /src/pages/Entities/Gifts/List/GiftsList.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | import {primaryColor} from '@theme'; 4 | 5 | export const styles = StyleSheet.create({ 6 | giftContainer: { 7 | paddingVertical: 20, 8 | paddingHorizontal: 15, 9 | backgroundColor: 'white', 10 | borderColor: '#E2E4E5', 11 | borderBottomWidth: 1 / PixelRatio.get(), 12 | }, 13 | descriptionText: { 14 | color: '#818181', 15 | fontSize: 14, 16 | marginTop: 5, 17 | }, 18 | badgeContainer: { 19 | flexDirection: 'row', 20 | marginTop: 10, 21 | }, 22 | badge: { 23 | paddingHorizontal: 5, 24 | paddingVertical: 2, 25 | borderRadius: 5, 26 | backgroundColor: primaryColor, 27 | }, 28 | badgeText: { 29 | color: 'white', 30 | fontSize: 13, 31 | }, 32 | }); 33 | -------------------------------------------------------------------------------- /src/pages/Entities/Gifts/List/GiftsListScreen.ts: -------------------------------------------------------------------------------- 1 | import {connect} from 'react-redux'; 2 | 3 | import {pop} from '@navigator/NavigationService'; 4 | import {getGiftsByContact} from '@redux/gifts'; 5 | import {GiftsList} from './GiftsList'; 6 | 7 | export const mapStateToProps = (state, {navigation}) => { 8 | const contact = state.contacts[navigation.state.params]; 9 | return { 10 | gifts: (contact.gifts || []).map(giftId => state.gifts[giftId]), 11 | isFetching: state.getGiftsByContact.isFetching, 12 | }; 13 | }; 14 | 15 | export const mapDispatchToProps = (dispatch, {navigation}) => ({ 16 | pop, 17 | getGiftsByContact: () => dispatch(getGiftsByContact(navigation.state.params)), 18 | }); 19 | 20 | export const GiftsListScreen = connect( 21 | mapStateToProps, 22 | mapDispatchToProps 23 | )(GiftsList); 24 | -------------------------------------------------------------------------------- /src/pages/Entities/Gifts/List/assets/empty-gifts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Gifts/List/assets/empty-gifts.png -------------------------------------------------------------------------------- /src/pages/Entities/Gifts/List/assets/empty-gifts@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Gifts/List/assets/empty-gifts@2x.png -------------------------------------------------------------------------------- /src/pages/Entities/Gifts/List/assets/empty-gifts@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Gifts/List/assets/empty-gifts@3x.png -------------------------------------------------------------------------------- /src/pages/Entities/Notes/List/NotesList.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | noteContainer: { 5 | paddingVertical: 20, 6 | paddingHorizontal: 15, 7 | backgroundColor: 'white', 8 | borderColor: '#E2E4E5', 9 | borderBottomWidth: 1 / PixelRatio.get(), 10 | }, 11 | date: { 12 | fontSize: 12, 13 | marginBottom: 8, 14 | flex: 1, 15 | }, 16 | favorite: { 17 | position: 'relative', 18 | bottom: 3, 19 | }, 20 | }); 21 | -------------------------------------------------------------------------------- /src/pages/Entities/Notes/List/assets/empty-notes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Notes/List/assets/empty-notes.png -------------------------------------------------------------------------------- /src/pages/Entities/Notes/List/assets/empty-notes@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Notes/List/assets/empty-notes@2x.png -------------------------------------------------------------------------------- /src/pages/Entities/Notes/List/assets/empty-notes@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Notes/List/assets/empty-notes@3x.png -------------------------------------------------------------------------------- /src/pages/Entities/Notes/Upsert/NotesUpsert.style.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | container: { 5 | backgroundColor: 'white', 6 | borderColor: '#E2E4E5', 7 | borderBottomWidth: 1 / PixelRatio.get(), 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /src/pages/Entities/Notes/Upsert/form/NoteForm.model.ts: -------------------------------------------------------------------------------- 1 | import {IContact, INote} from '@models'; 2 | import {ReactNode, RefObject} from 'react'; 3 | 4 | export interface IProps { 5 | onSuccess?: (values: IValues) => void; 6 | note?: INote; 7 | ref?: RefObject; 8 | contact: IContact; 9 | } 10 | export interface IValues { 11 | contact: IContact; 12 | body: string; 13 | is_favorited: boolean; 14 | } 15 | -------------------------------------------------------------------------------- /src/pages/Entities/Notes/Upsert/form/NoteForm.styles.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | field: { 5 | height: 200, 6 | }, 7 | }); 8 | -------------------------------------------------------------------------------- /src/pages/Entities/Reminders/List/RemindersListScreen.ts: -------------------------------------------------------------------------------- 1 | import {connect} from 'react-redux'; 2 | 3 | import {pop} from '@navigator/NavigationService'; 4 | import {getRemindersByContact} from '@redux/reminders'; 5 | import {RemindersList} from './RemindersList'; 6 | 7 | export const mapStateToProps = (state, {navigation}) => { 8 | const contact = state.contacts[navigation.state.params]; 9 | return { 10 | reminders: (contact.reminders || []).map( 11 | reminderId => state.reminders[reminderId] 12 | ), 13 | isFetching: state.getRemindersByContact.isFetching, 14 | }; 15 | }; 16 | 17 | export const mapDispatchToProps = (dispatch, {navigation}) => ({ 18 | pop, 19 | getRemindersByContact: () => 20 | dispatch(getRemindersByContact(navigation.state.params)), 21 | }); 22 | 23 | export const RemindersListScreen = connect( 24 | mapStateToProps, 25 | mapDispatchToProps 26 | )(RemindersList); 27 | -------------------------------------------------------------------------------- /src/pages/Entities/Reminders/List/assets/empty-reminders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Reminders/List/assets/empty-reminders.png -------------------------------------------------------------------------------- /src/pages/Entities/Reminders/List/assets/empty-reminders@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Reminders/List/assets/empty-reminders@2x.png -------------------------------------------------------------------------------- /src/pages/Entities/Reminders/List/assets/empty-reminders@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Reminders/List/assets/empty-reminders@3x.png -------------------------------------------------------------------------------- /src/pages/Entities/Tasks/List/TasksList.styles.ts: -------------------------------------------------------------------------------- 1 | import {PixelRatio, StyleSheet} from 'react-native'; 2 | 3 | export const styles = StyleSheet.create({ 4 | taskContainer: { 5 | paddingVertical: 10, 6 | paddingHorizontal: 15, 7 | backgroundColor: 'white', 8 | borderColor: '#E2E4E5', 9 | borderBottomWidth: 1 / PixelRatio.get(), 10 | flexDirection: 'row', 11 | }, 12 | descriptionText: { 13 | color: '#818181', 14 | fontSize: 14, 15 | marginTop: 5, 16 | }, 17 | textContainer: { 18 | paddingLeft: 15, 19 | paddingRight: 30, 20 | }, 21 | }); 22 | -------------------------------------------------------------------------------- /src/pages/Entities/Tasks/List/TasksListScreen.ts: -------------------------------------------------------------------------------- 1 | import {connect} from 'react-redux'; 2 | 3 | import {pop} from '@navigator/NavigationService'; 4 | import {getTasksByContact} from '@redux/tasks'; 5 | import {TasksList} from './TasksList'; 6 | 7 | export const mapStateToProps = (state, {navigation}) => { 8 | const contact = state.contacts[navigation.state.params]; 9 | return { 10 | tasks: (contact.tasks || []).map(taskId => state.tasks[taskId]), 11 | isFetching: state.getTasksByContact.isFetching, 12 | }; 13 | }; 14 | 15 | export const mapDispatchToProps = (dispatch, {navigation}) => ({ 16 | pop, 17 | getTasksByContact: () => dispatch(getTasksByContact(navigation.state.params)), 18 | }); 19 | 20 | export const TasksListScreen = connect( 21 | mapStateToProps, 22 | mapDispatchToProps 23 | )(TasksList); 24 | -------------------------------------------------------------------------------- /src/pages/Entities/Tasks/List/assets/empty-tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Tasks/List/assets/empty-tasks.png -------------------------------------------------------------------------------- /src/pages/Entities/Tasks/List/assets/empty-tasks@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Tasks/List/assets/empty-tasks@2x.png -------------------------------------------------------------------------------- /src/pages/Entities/Tasks/List/assets/empty-tasks@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/monicahq/old_mobile_app/c2579cb341182d5fd745027bf523d51edd0a517b/src/pages/Entities/Tasks/List/assets/empty-tasks@3x.png -------------------------------------------------------------------------------- /src/pages/JournalScreen.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {View} from 'react-native'; 3 | 4 | import {Navbar} from '@components'; 5 | import {I18n} from '@i18n'; 6 | import {appScreensStyles} from '@theme'; 7 | 8 | export const JournalScreen = () => ( 9 | 10 | 11 | 12 | ); 13 | -------------------------------------------------------------------------------- /src/pages/Settings/SettingsScreen.ts: -------------------------------------------------------------------------------- 1 | import {navigate} from '@navigator/NavigationService'; 2 | import {subscribeBeta} from '@redux/beta'; 3 | import {logout} from '@redux/user'; 4 | import {connect} from 'react-redux'; 5 | 6 | import {Settings} from './Settings'; 7 | 8 | export const mapStateToProps = state => ({ 9 | beta: state.beta.isSubscribed, 10 | }); 11 | 12 | export const mapDispatchToProps = dispatch => ({ 13 | logout: () => dispatch(logout()), 14 | goToLaunchScreen: () => navigate('Auth'), 15 | subscribeBeta: isSubscribed => dispatch(subscribeBeta(isSubscribed)), 16 | }); 17 | 18 | export const SettingsScreen = connect( 19 | mapStateToProps, 20 | mapDispatchToProps 21 | )(Settings); 22 | -------------------------------------------------------------------------------- /src/redux/activities/actions.ts: -------------------------------------------------------------------------------- 1 | import {IActivity, IMetaStatistics} from '@models'; 2 | import {action} from 'typesafe-actions'; 3 | import * as types from './types'; 4 | 5 | export const getActivitiesByContactFetched = (contactId: number) => 6 | action(types.GET_ACTIVITIES_BY_CONTACT_FETCHED, { 7 | contactId, 8 | }); 9 | 10 | export const getActivitiesByContactSuccess = ( 11 | contactId: number, 12 | activities: IActivity[], 13 | statistics: IMetaStatistics 14 | ) => 15 | action(types.GET_ACTIVITIES_BY_CONTACT_SUCCESS, { 16 | activities, 17 | contactId, 18 | statistics, 19 | }); 20 | 21 | export const getActivitiesByContactFailed = (error: Error) => 22 | action(types.GET_ACTIVITIES_BY_CONTACT_FAILED, { 23 | error, 24 | }); 25 | -------------------------------------------------------------------------------- /src/redux/activities/index.ts: -------------------------------------------------------------------------------- 1 | export * from './operations'; 2 | -------------------------------------------------------------------------------- /src/redux/activities/types.ts: -------------------------------------------------------------------------------- 1 | export const GET_ACTIVITIES_BY_CONTACT_FETCHED = 2 | 'Contacts/GET_ACTIVITIES_BY_CONTACT_FETCHED'; 3 | export const GET_ACTIVITIES_BY_CONTACT_SUCCESS = 4 | 'Contacts/GET_ACTIVITIES_BY_CONTACT_SUCCESS'; 5 | export const GET_ACTIVITIES_BY_CONTACT_FAILED = 6 | 'Contacts/GET_ACTIVITIES_BY_CONTACT_FAILED'; 7 | -------------------------------------------------------------------------------- /src/redux/beta/__tests__/actions.spec.ts: -------------------------------------------------------------------------------- 1 | import {subscribeBeta} from '../actions'; 2 | import * as types from '../types'; 3 | 4 | describe('Redux', () => { 5 | describe('Beta', () => { 6 | describe('Actions', () => { 7 | it('subscribeBeta true', () => { 8 | expect(subscribeBeta(true)).toEqual({ 9 | type: types.SUBSCRIBE_BETA, 10 | payload: { 11 | isSubscribed: true, 12 | }, 13 | }); 14 | }); 15 | 16 | it('subscribeBeta false', () => { 17 | expect(subscribeBeta(false)).toEqual({ 18 | type: types.SUBSCRIBE_BETA, 19 | payload: {isSubscribed: false}, 20 | }); 21 | }); 22 | }); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/redux/beta/actions.ts: -------------------------------------------------------------------------------- 1 | import {action} from 'typesafe-actions'; 2 | import * as types from './types'; 3 | 4 | export const subscribeBeta = (isSubscribed: boolean) => 5 | action(types.SUBSCRIBE_BETA, { 6 | isSubscribed, 7 | }); 8 | -------------------------------------------------------------------------------- /src/redux/beta/index.ts: -------------------------------------------------------------------------------- 1 | export * from './operations'; 2 | -------------------------------------------------------------------------------- /src/redux/beta/operations.ts: -------------------------------------------------------------------------------- 1 | import {AsyncStorage} from 'react-native'; 2 | 3 | import {betaKey} from '@src/storage-keys'; 4 | import * as actions from './actions'; 5 | 6 | export type IBetaSubscribeOperation = typeof subscribeBeta; 7 | 8 | export function subscribeBeta(isSubscribed: boolean) { 9 | if (isSubscribed) { 10 | AsyncStorage.setItem(betaKey, 'true'); 11 | } else { 12 | AsyncStorage.removeItem(betaKey); 13 | } 14 | return actions.subscribeBeta(isSubscribed); 15 | } 16 | -------------------------------------------------------------------------------- /src/redux/beta/reducer.ts: -------------------------------------------------------------------------------- 1 | import {IRootAction} from '@models'; 2 | import * as types from './types'; 3 | 4 | export interface IBetaState { 5 | readonly ready: boolean; 6 | readonly isSubscribed: boolean; 7 | } 8 | 9 | const initialState: IBetaState = { 10 | ready: false, 11 | isSubscribed: false, 12 | }; 13 | 14 | export const betaReducer = ( 15 | state = initialState, 16 | action: IRootAction 17 | ): IBetaState => { 18 | switch (action.type) { 19 | case types.SUBSCRIBE_BETA: 20 | return { 21 | ready: true, 22 | isSubscribed: action.payload.isSubscribed, 23 | }; 24 | } 25 | 26 | return state; 27 | }; 28 | -------------------------------------------------------------------------------- /src/redux/beta/types.ts: -------------------------------------------------------------------------------- 1 | export const SUBSCRIBE_BETA = 'Beta/SUBSCRIBE'; 2 | -------------------------------------------------------------------------------- /src/redux/calls/actions.ts: -------------------------------------------------------------------------------- 1 | import {ICall, IMetaStatistics} from '@models'; 2 | import {action} from 'typesafe-actions'; 3 | import * as types from './types'; 4 | 5 | export const getCallsByContactFetched = (contactId: number) => 6 | action(types.GET_CALLS_BY_CONTACT_FETCHED, { 7 | contactId, 8 | }); 9 | 10 | export const getCallsByContactSuccess = ( 11 | contactId: number, 12 | calls: ICall[], 13 | statistics: IMetaStatistics 14 | ) => 15 | action(types.GET_CALLS_BY_CONTACT_SUCCESS, { 16 | calls, 17 | contactId, 18 | statistics, 19 | }); 20 | 21 | export const getCallsByContactFailed = (error: Error) => 22 | action(types.GET_CALLS_BY_CONTACT_FAILED, { 23 | error, 24 | }); 25 | -------------------------------------------------------------------------------- /src/redux/calls/index.ts: -------------------------------------------------------------------------------- 1 | export * from './operations'; 2 | -------------------------------------------------------------------------------- /src/redux/calls/types.ts: -------------------------------------------------------------------------------- 1 | export const GET_CALLS_BY_CONTACT_FETCHED = 2 | 'Contacts/GET_CALLS_BY_CONTACT_FETCHED'; 3 | export const GET_CALLS_BY_CONTACT_SUCCESS = 4 | 'Contacts/GET_CALLS_BY_CONTACT_SUCCESS'; 5 | export const GET_CALLS_BY_CONTACT_FAILED = 6 | 'Contacts/GET_CALLS_BY_CONTACT_FAILED'; 7 | -------------------------------------------------------------------------------- /src/redux/configureStore.ts: -------------------------------------------------------------------------------- 1 | import {applyMiddleware, compose, createStore} from 'redux'; 2 | import createDebounce from 'redux-debounced'; 3 | import {composeWithDevTools} from 'redux-devtools-extension'; 4 | import thunk from 'redux-thunk'; 5 | 6 | import rootReducer, {IRootState} from './rootReducer'; 7 | 8 | const enhancers = [createDebounce(), thunk]; 9 | 10 | export default function configureStore(initialState?: IRootState) { 11 | const c: any = __DEV__ ? composeWithDevTools : compose; 12 | const enhancer = c(applyMiddleware(...enhancers)); 13 | 14 | // TODO remove any 15 | return createStore(rootReducer, initialState! as any, enhancer); 16 | } 17 | -------------------------------------------------------------------------------- /src/redux/contacts/actions.ts: -------------------------------------------------------------------------------- 1 | import {IContact} from '@models'; 2 | import {action} from 'typesafe-actions'; 3 | import * as types from './types'; 4 | 5 | /** 6 | * Actions 7 | */ 8 | 9 | export const getContactsFetched = () => action(types.GET_ALL_FETCHED); 10 | 11 | export const getContactsSuccess = (items: IContact[], count: number) => 12 | action(types.GET_ALL_SUCCESS, { 13 | items, 14 | count, 15 | }); 16 | 17 | export const getContactsFailed = (error: Error) => 18 | action(types.GET_ALL_FAILED, { 19 | error, 20 | }); 21 | 22 | export const searchContactsFetched = (query: string) => 23 | action(types.SEARCH_FETCHED, { 24 | query, 25 | }); 26 | 27 | export const searchContactsSuccess = (items: IContact[], count: number) => 28 | action(types.SEARCH_SUCCESS, { 29 | items, 30 | count, 31 | }); 32 | 33 | export const searchContactsFailed = (error: Error) => 34 | action(types.SEARCH_FAILED, { 35 | error, 36 | }); 37 | -------------------------------------------------------------------------------- /src/redux/contacts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './operations'; 2 | -------------------------------------------------------------------------------- /src/redux/contacts/types.ts: -------------------------------------------------------------------------------- 1 | export const GET_ALL_FETCHED = 'Contacts/GET_ALL_FETCHED'; 2 | export const GET_ALL_SUCCESS = 'Contacts/GET_ALL_SUCCESS'; 3 | export const GET_ALL_FAILED = 'Contacts/GET_ALL_FAILED'; 4 | 5 | export const SEARCH_FETCHED = 'Contacts/SEARCH_FETCHED'; 6 | export const SEARCH_SUCCESS = 'Contacts/SEARCH_SUCCESS'; 7 | export const SEARCH_FAILED = 'Contacts/SEARCH_FAILED'; 8 | -------------------------------------------------------------------------------- /src/redux/debts/actions.ts: -------------------------------------------------------------------------------- 1 | import {IDebt} from '@models'; 2 | import {action} from 'typesafe-actions'; 3 | import * as types from './types'; 4 | 5 | export const getDebtsByContactFetched = (contactId: number) => 6 | action(types.GET_DEBTS_BY_CONTACT_FETCHED, { 7 | contactId, 8 | }); 9 | 10 | export const getDebtsByContactSuccess = (contactId: number, debts: IDebt[]) => 11 | action(types.GET_DEBTS_BY_CONTACT_SUCCESS, { 12 | debts, 13 | contactId, 14 | }); 15 | 16 | export const getDebtsByContactFailed = (error: Error) => 17 | action(types.GET_DEBTS_BY_CONTACT_FAILED, { 18 | error, 19 | }); 20 | -------------------------------------------------------------------------------- /src/redux/debts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './operations'; 2 | -------------------------------------------------------------------------------- /src/redux/debts/types.ts: -------------------------------------------------------------------------------- 1 | export const GET_DEBTS_BY_CONTACT_FETCHED = 2 | 'Contacts/GET_DEBTS_BY_CONTACT_FETCHED'; 3 | export const GET_DEBTS_BY_CONTACT_SUCCESS = 4 | 'Contacts/GET_DEBTS_BY_CONTACT_SUCCESS'; 5 | export const GET_DEBTS_BY_CONTACT_FAILED = 6 | 'Contacts/GET_DEBTS_BY_CONTACT_FAILED'; 7 | -------------------------------------------------------------------------------- /src/redux/gifts/actions.ts: -------------------------------------------------------------------------------- 1 | import {IGift} from '@models'; 2 | import {action} from 'typesafe-actions'; 3 | import * as types from './types'; 4 | 5 | export const getGiftsByContactFetched = (contactId: number) => 6 | action(types.GET_GIFTS_BY_CONTACT_FETCHED, { 7 | contactId, 8 | }); 9 | 10 | export const getGiftsByContactSuccess = (contactId: number, gifts: IGift[]) => 11 | action(types.GET_GIFTS_BY_CONTACT_SUCCESS, { 12 | gifts, 13 | contactId, 14 | }); 15 | 16 | export const getGiftsByContactFailed = (error: Error) => 17 | action(types.GET_GIFTS_BY_CONTACT_FAILED, { 18 | error, 19 | }); 20 | -------------------------------------------------------------------------------- /src/redux/gifts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './operations'; 2 | -------------------------------------------------------------------------------- /src/redux/gifts/types.ts: -------------------------------------------------------------------------------- 1 | export const GET_GIFTS_BY_CONTACT_FETCHED = 2 | 'Contacts/GET_GIFTS_BY_CONTACT_FETCHED'; 3 | export const GET_GIFTS_BY_CONTACT_SUCCESS = 4 | 'Contacts/GET_GIFTS_BY_CONTACT_SUCCESS'; 5 | export const GET_GIFTS_BY_CONTACT_FAILED = 6 | 'Contacts/GET_GIFTS_BY_CONTACT_FAILED'; 7 | -------------------------------------------------------------------------------- /src/redux/notes/actions.ts: -------------------------------------------------------------------------------- 1 | import {INote} from '@models'; 2 | import {action} from 'typesafe-actions'; 3 | import * as types from './types'; 4 | 5 | export const getNotesByContactFetched = (contactId: number) => 6 | action(types.GET_NOTES_BY_CONTACT_FETCHED, { 7 | contactId, 8 | }); 9 | 10 | export const getNotesByContactSuccess = (contactId: number, notes: INote[]) => 11 | action(types.GET_NOTES_BY_CONTACT_SUCCESS, { 12 | notes, 13 | contactId, 14 | }); 15 | 16 | export const getNotesByContactFailed = (error: Error) => 17 | action(types.GET_NOTES_BY_CONTACT_FAILED, { 18 | error, 19 | }); 20 | 21 | export const updateNote = (note: INote) => action(types.UPDATE_NOTE, note); 22 | 23 | export const addNote = (note: INote) => action(types.ADD_NOTE, note); 24 | export const updateNoteId = (noteId: any, newId: any) => 25 | action(types.UPDATE_NOTE_ID, {noteId, newId}); 26 | 27 | export const deleteNote = (note: INote, id?: any) => 28 | action(types.DELETE_NOTE, {note, id}); 29 | -------------------------------------------------------------------------------- /src/redux/notes/index.ts: -------------------------------------------------------------------------------- 1 | export * from './operations'; 2 | -------------------------------------------------------------------------------- /src/redux/notes/types.ts: -------------------------------------------------------------------------------- 1 | export const GET_NOTES_BY_CONTACT_FETCHED = 2 | 'Contacts/GET_NOTES_BY_CONTACT_FETCHED'; 3 | export const GET_NOTES_BY_CONTACT_SUCCESS = 4 | 'Contacts/GET_NOTES_BY_CONTACT_SUCCESS'; 5 | export const GET_NOTES_BY_CONTACT_FAILED = 6 | 'Contacts/GET_NOTES_BY_CONTACT_FAILED'; 7 | export const UPDATE_NOTE = 'Contacts/NOTE_UPDATE'; 8 | export const UPDATE_NOTE_ID = 'Contacts/UPDATE_NOTE_ID'; 9 | export const ADD_NOTE = 'Contacts/NOTE_ADD'; 10 | export const DELETE_NOTE = 'Contacts/NOTE_DELETE'; 11 | -------------------------------------------------------------------------------- /src/redux/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@redux" 3 | } 4 | -------------------------------------------------------------------------------- /src/redux/reminders/actions.ts: -------------------------------------------------------------------------------- 1 | import {IReminder} from '@models'; 2 | import {action} from 'typesafe-actions'; 3 | import * as types from './types'; 4 | 5 | export const getRemindersByContactFetched = (contactId: number) => 6 | action(types.GET_REMINDERS_BY_CONTACT_FETCHED, { 7 | contactId, 8 | }); 9 | 10 | export const getRemindersByContactSuccess = ( 11 | contactId: number, 12 | reminders: IReminder[] 13 | ) => 14 | action(types.GET_REMINDERS_BY_CONTACT_SUCCESS, { 15 | reminders, 16 | contactId, 17 | }); 18 | 19 | export const getRemindersByContactFailed = (error: Error) => 20 | action(types.GET_REMINDERS_BY_CONTACT_FAILED, { 21 | error, 22 | }); 23 | -------------------------------------------------------------------------------- /src/redux/reminders/index.ts: -------------------------------------------------------------------------------- 1 | export * from './operations'; 2 | -------------------------------------------------------------------------------- /src/redux/reminders/types.ts: -------------------------------------------------------------------------------- 1 | export const GET_REMINDERS_BY_CONTACT_FETCHED = 2 | 'Contacts/GET_REMINDERS_BY_CONTACT_FETCHED'; 3 | export const GET_REMINDERS_BY_CONTACT_SUCCESS = 4 | 'Contacts/GET_REMINDERS_BY_CONTACT_SUCCESS'; 5 | export const GET_REMINDERS_BY_CONTACT_FAILED = 6 | 'Contacts/GET_REMINDERS_BY_CONTACT_FAILED'; 7 | -------------------------------------------------------------------------------- /src/redux/tasks/actions.ts: -------------------------------------------------------------------------------- 1 | import {ITask} from '@models'; 2 | import {action} from 'typesafe-actions'; 3 | import * as types from './types'; 4 | 5 | export const getTasksByContactFetched = (contactId: number) => 6 | action(types.GET_TASKS_BY_CONTACT_FETCHED, { 7 | contactId, 8 | }); 9 | 10 | export const getTasksByContactSuccess = (contactId: number, tasks: ITask[]) => 11 | action(types.GET_TASKS_BY_CONTACT_SUCCESS, { 12 | tasks, 13 | contactId, 14 | }); 15 | 16 | export const getTasksByContactFailed = (error: Error) => 17 | action(types.GET_TASKS_BY_CONTACT_FAILED, { 18 | error, 19 | }); 20 | -------------------------------------------------------------------------------- /src/redux/tasks/index.ts: -------------------------------------------------------------------------------- 1 | export * from './operations'; 2 | -------------------------------------------------------------------------------- /src/redux/tasks/types.ts: -------------------------------------------------------------------------------- 1 | export const GET_TASKS_BY_CONTACT_FETCHED = 2 | 'Contacts/GET_TASKS_BY_CONTACT_FETCHED'; 3 | export const GET_TASKS_BY_CONTACT_SUCCESS = 4 | 'Contacts/GET_TASKS_BY_CONTACT_SUCCESS'; 5 | export const GET_TASKS_BY_CONTACT_FAILED = 6 | 'Contacts/GET_TASKS_BY_CONTACT_FAILED'; 7 | -------------------------------------------------------------------------------- /src/redux/user/__tests__/actions.spec.ts: -------------------------------------------------------------------------------- 1 | import {logout, setToken} from '../actions'; 2 | import * as types from '../types'; 3 | 4 | describe('Redux', () => { 5 | describe('User', () => { 6 | describe('Actions', () => { 7 | it('logout', () => { 8 | expect(logout()).toEqual({ 9 | type: types.LOGOUT, 10 | }); 11 | }); 12 | 13 | it('setToken', () => { 14 | const token = 'my-token'; 15 | expect(setToken(token)).toEqual({ 16 | type: types.SET_TOKEN, 17 | payload: { 18 | token, 19 | }, 20 | }); 21 | }); 22 | }); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/redux/user/__tests__/reducer.spec.ts: -------------------------------------------------------------------------------- 1 | import {logout, setToken} from '../actions'; 2 | import {tokenReducer} from '../reducer'; 3 | 4 | describe('Redux', () => { 5 | describe('User', () => { 6 | describe('Token Reducer', () => { 7 | it('should return the initial state', () => { 8 | expect(tokenReducer(undefined, {} as any)).toBe(null); 9 | }); 10 | 11 | it('should handle setToken action', () => { 12 | const token = 'my-token'; 13 | expect(tokenReducer(undefined, setToken(token))).toBe(token); 14 | }); 15 | 16 | it('should handle logout action', () => { 17 | const token = 'my-token'; 18 | expect(tokenReducer(token, logout())).toBe(null); 19 | }); 20 | }); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /src/redux/user/actions.ts: -------------------------------------------------------------------------------- 1 | import {action} from 'typesafe-actions'; 2 | import * as types from './types'; 3 | 4 | export const setToken = (token: string) => 5 | action(types.SET_TOKEN, { 6 | token, 7 | }); 8 | 9 | export const logout = () => action(types.LOGOUT); 10 | -------------------------------------------------------------------------------- /src/redux/user/index.ts: -------------------------------------------------------------------------------- 1 | export * from './operations'; 2 | -------------------------------------------------------------------------------- /src/redux/user/operations.ts: -------------------------------------------------------------------------------- 1 | import {AsyncStorage} from 'react-native'; 2 | 3 | import {API} from '@api'; 4 | import {tokenKey} from '@src/storage-keys'; 5 | import * as actions from './actions'; 6 | 7 | export type IUserSetTokenOperation = typeof setToken; 8 | export type IUserLogoutOperation = typeof logout; 9 | 10 | export function setToken(token: string) { 11 | API.setToken(token); 12 | // AsyncStorage.setItem(userKey, JSON.stringify(user)); 13 | AsyncStorage.setItem(tokenKey, token); 14 | return actions.setToken(token); 15 | } 16 | 17 | export function logout() { 18 | API.setToken(null); 19 | // AsyncStorage.removeItem(userKey); 20 | AsyncStorage.removeItem(tokenKey); 21 | return actions.logout(); 22 | } 23 | -------------------------------------------------------------------------------- /src/redux/user/reducer.ts: -------------------------------------------------------------------------------- 1 | import {IRootAction} from '@models'; 2 | import * as types from './types'; 3 | 4 | export type ITokenState = string; 5 | 6 | export const tokenReducer = ( 7 | state: ITokenState = null, 8 | action: IRootAction 9 | ): ITokenState => { 10 | switch (action.type) { 11 | case types.SET_TOKEN: 12 | return action.payload.token; 13 | case types.LOGOUT: 14 | return null; 15 | } 16 | 17 | return state; 18 | }; 19 | -------------------------------------------------------------------------------- /src/redux/user/types.ts: -------------------------------------------------------------------------------- 1 | export const SET_TOKEN = 'User/SET_TOKEN'; 2 | export const LOGOUT = 'User/LOGOUT'; 3 | -------------------------------------------------------------------------------- /src/storage-keys.ts: -------------------------------------------------------------------------------- 1 | export const betaKey = '@Beta/key'; 2 | export const tokenKey = '@User/token'; 3 | export const urlKey = '@Api/url'; 4 | -------------------------------------------------------------------------------- /src/theme/appScreen.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const appScreensStyles = StyleSheet.create({ 4 | container: { 5 | flex: 1, 6 | backgroundColor: 'white', 7 | }, 8 | }); 9 | -------------------------------------------------------------------------------- /src/theme/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@theme" 3 | } 4 | -------------------------------------------------------------------------------- /src/theme/preAuthScreen.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native'; 2 | 3 | export const preAuthScreensStyles = StyleSheet.create({ 4 | container: { 5 | flex: 1, 6 | alignItems: 'center', 7 | justifyContent: 'center', 8 | backgroundColor: 'white', 9 | }, 10 | centeredBlock: { 11 | paddingHorizontal: 30, 12 | width: '100%', 13 | justifyContent: 'center', 14 | alignItems: 'center', 15 | }, 16 | primaryText: { 17 | fontSize: 18, 18 | fontWeight: 'bold', 19 | marginTop: 40, 20 | marginBottom: 20, 21 | textAlign: 'center', 22 | }, 23 | secondaryText: { 24 | color: '#97A5B2', 25 | marginBottom: 20, 26 | textAlign: 'center', 27 | }, 28 | }); 29 | -------------------------------------------------------------------------------- /src/utils/__tests__/gifts.spec.ts: -------------------------------------------------------------------------------- 1 | import {getLabel} from '../gifts'; 2 | 3 | describe('Utils', () => { 4 | describe('Gifts', () => { 5 | describe('getLabel', () => { 6 | it('should display has been offered label', () => { 7 | const gift = { 8 | has_been_offered: true, 9 | }; 10 | expect(getLabel(gift as any)).toBe('offered'); 11 | }); 12 | 13 | it('should display is an idea label', () => { 14 | const gift = { 15 | is_an_idea: true, 16 | }; 17 | expect(getLabel(gift as any)).toBe('idea'); 18 | }); 19 | 20 | it('should return undefined in any other case', () => { 21 | const gift = {}; 22 | expect(getLabel(gift as any)).toBe(undefined); 23 | }); 24 | }); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /src/utils/gifts.ts: -------------------------------------------------------------------------------- 1 | import {I18n} from '@i18n'; 2 | import {IGift} from '@models'; 3 | 4 | export const getLabel = (gift: IGift) => { 5 | if (gift.has_been_offered) { 6 | return I18n.t('gifts:offered'); 7 | } 8 | if (gift.is_an_idea) { 9 | return I18n.t('gifts:idea'); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /src/utils/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@utils" 3 | } 4 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["tslint:latest", "tslint-react", "tslint-config-prettier"], 3 | "rulesDirectory": [ 4 | "tslint-plugin-prettier" 5 | ], 6 | "rules": { 7 | "prettier": [true, { 8 | "singleQuote": true, 9 | "trailingComma": "es5", 10 | "bracketSpacing": false 11 | }], 12 | "no-console": { 13 | "severity": "warning", 14 | "options": ["log", "info", "time"] 15 | }, 16 | "no-submodule-imports": false, 17 | "no-string-literal": false, 18 | "object-literal-sort-keys": false, 19 | "max-file-line-count": [true, 300], 20 | "no-unused-variable": true, 21 | "no-unused-expression": true, 22 | "cyclomatic-complexity": [true, 20], 23 | "semicolon": [true, "always", "ignore-bound-class-methods"], 24 | "no-implicit-dependencies": false, 25 | "max-classes-per-file": false 26 | } 27 | } 28 | --------------------------------------------------------------------------------