├── .watchmanconfig
├── .gitattributes
├── app.json
├── .env.development
├── PUXA-R10!.png
├── assets
└── fonts
│ ├── CircularStd-Bold.otf
│ ├── CircularStd-Book.otf
│ ├── Modesta-Script.ttf
│ ├── CircularStd-Black.otf
│ └── CircularStd-Medium.otf
├── android
├── app
│ ├── src
│ │ └── main
│ │ │ ├── res
│ │ │ ├── values
│ │ │ │ ├── strings.xml
│ │ │ │ ├── colors.xml
│ │ │ │ └── styles.xml
│ │ │ ├── drawable
│ │ │ │ ├── icon.png
│ │ │ │ ├── splash_screen_icon.png
│ │ │ │ └── background_splash.xml
│ │ │ ├── drawable-hdpi
│ │ │ │ └── icon.png
│ │ │ ├── drawable-ldpi
│ │ │ │ └── icon.png
│ │ │ ├── drawable-mdpi
│ │ │ │ └── icon.png
│ │ │ ├── drawable-xhdpi
│ │ │ │ └── icon.png
│ │ │ ├── drawable-xxhdpi
│ │ │ │ └── icon.png
│ │ │ ├── drawable-xxxhdpi
│ │ │ │ └── icon.png
│ │ │ └── layout
│ │ │ │ └── launch_screen.xml
│ │ │ ├── assets
│ │ │ └── fonts
│ │ │ │ ├── Entypo.ttf
│ │ │ │ ├── Feather.ttf
│ │ │ │ ├── Zocial.ttf
│ │ │ │ ├── AntDesign.ttf
│ │ │ │ ├── EvilIcons.ttf
│ │ │ │ ├── Foundation.ttf
│ │ │ │ ├── Ionicons.ttf
│ │ │ │ ├── Octicons.ttf
│ │ │ │ ├── FontAwesome.ttf
│ │ │ │ ├── MaterialIcons.ttf
│ │ │ │ ├── Modesta-Script.ttf
│ │ │ │ ├── SimpleLineIcons.ttf
│ │ │ │ ├── CircularStd-Black.otf
│ │ │ │ ├── CircularStd-Bold.otf
│ │ │ │ ├── CircularStd-Book.otf
│ │ │ │ ├── CircularStd-Medium.otf
│ │ │ │ ├── FontAwesome5_Brands.ttf
│ │ │ │ ├── FontAwesome5_Regular.ttf
│ │ │ │ ├── FontAwesome5_Solid.ttf
│ │ │ │ └── MaterialCommunityIcons.ttf
│ │ │ ├── java
│ │ │ └── com
│ │ │ │ └── mindcast
│ │ │ │ ├── SplashActivity.java
│ │ │ │ ├── MainActivity.java
│ │ │ │ └── MainApplication.java
│ │ │ └── AndroidManifest.xml
│ ├── build_defs.bzl
│ ├── proguard-rules.pro
│ └── BUCK
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── keystores
│ ├── debug.keystore.properties
│ └── BUCK
├── gradle.properties
├── build.gradle
├── settings.gradle
└── gradlew.bat
├── ios
├── mindCast
│ ├── Images.xcassets
│ │ ├── Contents.json
│ │ ├── logo.imageset
│ │ │ ├── icon.png
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ ├── Icon-20x20@2x.png
│ │ │ ├── Icon-20x20@3x.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
│ ├── AppDelegate.h
│ ├── main.m
│ ├── AppDelegate.m
│ ├── Base.lproj
│ │ └── LaunchScreen.xib
│ └── Info.plist
├── mindCastTests
│ ├── Info.plist
│ └── mindCastTests.m
├── mindCast-tvOSTests
│ └── Info.plist
└── mindCast-tvOS
│ └── Info.plist
├── flow-typed
└── npm
│ ├── react-native_vx.x.x.js
│ ├── react-native-fs_vx.x.x.js
│ ├── flow-bin_v0.x.x.js
│ ├── babel-jest_vx.x.x.js
│ ├── babel-core_vx.x.x.js
│ ├── reactotron-redux_vx.x.x.js
│ ├── reactotron-redux-saga_vx.x.x.js
│ ├── reactotron-react-native_vx.x.x.js
│ ├── prettier-eslint_vx.x.x.js
│ ├── eslint-import-resolver-babel-plugin-root-import_vx.x.x.js
│ ├── babel-plugin-root-import_vx.x.x.js
│ ├── flow_vx.x.x.js
│ ├── react-native-side-menu_vx.x.x.js
│ ├── metro-react-native-babel-preset_vx.x.x.js
│ └── react-test-renderer_v16.x.x.js
├── jsconfig.json
├── .buckconfig
├── .editorconfig
├── src
├── services
│ └── api.js
├── config
│ └── ReactotronConfig.js
├── store
│ ├── ducks
│ │ ├── index.js
│ │ ├── home.js
│ │ └── subject.js
│ ├── sagas
│ │ ├── subject.js
│ │ ├── utils
│ │ │ └── parseParams.js
│ │ ├── author.js
│ │ └── home.js
│ └── index.js
├── components
│ ├── screens
│ │ ├── settings
│ │ │ ├── about
│ │ │ │ ├── SOCIAL_BUTTONS.js
│ │ │ │ └── HeartBeating.js
│ │ │ └── routes.js
│ │ ├── interests
│ │ │ └── Interests.js
│ │ ├── login
│ │ │ └── components
│ │ │ │ ├── DefaultText.js
│ │ │ │ ├── BackgroundImage.js
│ │ │ │ ├── Header.js
│ │ │ │ ├── ChangeAction.js
│ │ │ │ ├── LoginComponent.js
│ │ │ │ ├── RegisterComponent.js
│ │ │ │ └── Input.js
│ │ ├── library
│ │ │ ├── Library.js
│ │ │ └── components
│ │ │ │ ├── sections
│ │ │ │ └── SectionItem.js
│ │ │ │ ├── playlists
│ │ │ │ └── PlaylistOperationModal.js
│ │ │ │ ├── playlist-detail
│ │ │ │ └── components
│ │ │ │ │ ├── PodcastListItem.js
│ │ │ │ │ └── PlaylistDetailComponent.js
│ │ │ │ └── PodcastsDownloaded.js
│ │ ├── home
│ │ │ ├── Home.js
│ │ │ └── components
│ │ │ │ ├── trending-authors
│ │ │ │ ├── TrendingAuthorsSeeAll.js
│ │ │ │ └── trending-authors-discover
│ │ │ │ │ └── TrendingAuthorsDiscover.js
│ │ │ │ ├── new-releases
│ │ │ │ ├── NewReleasesSeeAll.js
│ │ │ │ └── new-releases-discover
│ │ │ │ │ └── NewReleasesDiscover.js
│ │ │ │ └── hottest-podcasts
│ │ │ │ ├── HottestPodcastsDiscover.js
│ │ │ │ └── HottestPodcastsSeeAll.js
│ │ ├── search
│ │ │ ├── components
│ │ │ │ ├── search-author
│ │ │ │ │ └── SearchAuthorListContainer.js
│ │ │ │ ├── subject-detail
│ │ │ │ │ ├── SubjectDetailContainer.js
│ │ │ │ │ └── components
│ │ │ │ │ │ └── trending
│ │ │ │ │ │ └── Trending.js
│ │ │ │ ├── subjects-list
│ │ │ │ │ └── SubjectListItem.js
│ │ │ │ ├── SearchComponent.js
│ │ │ │ └── SearchAuthorTextInput.js
│ │ │ └── SearchContainer.js
│ │ └── oboarding-intro
│ │ │ └── components
│ │ │ └── MiddleContent.js
│ └── common
│ │ ├── Icon.js
│ │ ├── author-detail
│ │ ├── components
│ │ │ ├── SectionWrapper.js
│ │ │ ├── AuthorName.js
│ │ │ ├── AboutSection.js
│ │ │ ├── SubjectsSection.js
│ │ │ ├── featured-section
│ │ │ │ └── FeaturedSection.js
│ │ │ ├── related-authors
│ │ │ │ ├── RelatedAuthorsListItem.js
│ │ │ │ └── RelatedAuthors.js
│ │ │ └── new-releases-section
│ │ │ │ └── NewReleasesSection.js
│ │ └── AuthorDetailContainer.js
│ │ ├── Loading.js
│ │ ├── player
│ │ └── components
│ │ │ ├── bottom-player-options
│ │ │ ├── components
│ │ │ │ ├── AddPodcastPlaylist.js
│ │ │ │ ├── Button.js
│ │ │ │ └── ShufflePlaylist.js
│ │ │ └── BottomPlayerOptions.js
│ │ │ ├── BackgroundImage.js
│ │ │ ├── PodcastImage.js
│ │ │ └── PodcastTextContent.js
│ │ ├── ScreenTitle.js
│ │ ├── SwipeOutButton.js
│ │ ├── SectionTitle.js
│ │ ├── Switch.js
│ │ ├── SectionWithButton.js
│ │ ├── HeaderActionButton.js
│ │ ├── HeaderButton.js
│ │ ├── navigation
│ │ ├── components
│ │ │ ├── navigation-bar
│ │ │ │ ├── NavigationBar.js
│ │ │ │ └── NavigationBarItem.js
│ │ │ └── ProgressTimeLine.js
│ │ └── Navigation.js
│ │ ├── AuthorInfo.js
│ │ ├── DefaultButton.js
│ │ ├── ErrorMessage.js
│ │ ├── interests
│ │ └── InterestsListItem.js
│ │ ├── ProgressiveImage.js
│ │ ├── PlaylistCompositionImages.js
│ │ ├── podcast-detail
│ │ └── components
│ │ │ ├── BottomContent.js
│ │ │ └── PodcastInfo.js
│ │ ├── playlists-list
│ │ └── components
│ │ │ └── CreatePlaylistButton.js
│ │ └── Alert.js
├── styles
│ ├── index.js
│ ├── colors.js
│ └── metrics.js
├── index.js
├── utils
│ ├── isEqualsOrLargestThanIphoneX.js
│ ├── AsyncStorageManager.js
│ └── CONSTANTS.js
└── routes
│ ├── mainStack.js
│ └── index.js
├── index.js
├── babel.config.js
├── .gitignore
├── LICENSE
├── .eslintrc.json
├── package.json
└── .flowconfig
/.watchmanconfig:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.pbxproj -text
2 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mindCast",
3 | "displayName": "mindCast"
4 | }
--------------------------------------------------------------------------------
/.env.development:
--------------------------------------------------------------------------------
1 | SERVER_URL=http://192.168.25.27:3001/mind-cast/api/v1
2 |
--------------------------------------------------------------------------------
/PUXA-R10!.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/PUXA-R10!.png
--------------------------------------------------------------------------------
/assets/fonts/CircularStd-Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/assets/fonts/CircularStd-Bold.otf
--------------------------------------------------------------------------------
/assets/fonts/CircularStd-Book.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/assets/fonts/CircularStd-Book.otf
--------------------------------------------------------------------------------
/assets/fonts/Modesta-Script.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/assets/fonts/Modesta-Script.ttf
--------------------------------------------------------------------------------
/android/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | MindCast
3 |
4 |
--------------------------------------------------------------------------------
/assets/fonts/CircularStd-Black.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/assets/fonts/CircularStd-Black.otf
--------------------------------------------------------------------------------
/assets/fonts/CircularStd-Medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/assets/fonts/CircularStd-Medium.otf
--------------------------------------------------------------------------------
/ios/mindCast/Images.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/flow-typed/npm/react-native_vx.x.x.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | declare module 'react-native' {
4 | declare module.exports: any;
5 | }
6 |
--------------------------------------------------------------------------------
/flow-typed/npm/react-native-fs_vx.x.x.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | declare module 'react-native-fs' {
4 | declare module.exports: any;
5 | }
6 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/res/drawable/icon.png
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "baseUrl": ".",
4 | "paths": {
5 | "~/*": ["src/*"]
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/Entypo.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/Entypo.ttf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/Feather.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/Feather.ttf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/Zocial.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/Zocial.ttf
--------------------------------------------------------------------------------
/.buckconfig:
--------------------------------------------------------------------------------
1 |
2 | [android]
3 | target = Google Inc.:Google APIs:23
4 |
5 | [maven_repositories]
6 | central = https://repo1.maven.org/maven2
7 |
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/AntDesign.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/AntDesign.ttf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/EvilIcons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/EvilIcons.ttf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/Foundation.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/Foundation.ttf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/Ionicons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/Ionicons.ttf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/Octicons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/Octicons.ttf
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-hdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/res/drawable-hdpi/icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-ldpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/res/drawable-ldpi/icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-mdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/res/drawable-mdpi/icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/res/drawable-xhdpi/icon.png
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/FontAwesome.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/FontAwesome.ttf
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/res/drawable-xxhdpi/icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/res/drawable-xxxhdpi/icon.png
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/MaterialIcons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/MaterialIcons.ttf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/Modesta-Script.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/Modesta-Script.ttf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/SimpleLineIcons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/SimpleLineIcons.ttf
--------------------------------------------------------------------------------
/ios/mindCast/Images.xcassets/logo.imageset/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/ios/mindCast/Images.xcassets/logo.imageset/icon.png
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/CircularStd-Black.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/CircularStd-Black.otf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/CircularStd-Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/CircularStd-Bold.otf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/CircularStd-Book.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/CircularStd-Book.otf
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/CircularStd-Medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/CircularStd-Medium.otf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/FontAwesome5_Brands.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/FontAwesome5_Brands.ttf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/FontAwesome5_Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/FontAwesome5_Regular.ttf
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/FontAwesome5_Solid.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/FontAwesome5_Solid.ttf
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/splash_screen_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/res/drawable/splash_screen_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf
--------------------------------------------------------------------------------
/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x.png
--------------------------------------------------------------------------------
/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-20x20@3x.png
--------------------------------------------------------------------------------
/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-29x29@2x.png
--------------------------------------------------------------------------------
/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-29x29@3x.png
--------------------------------------------------------------------------------
/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-40x40@2x.png
--------------------------------------------------------------------------------
/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-40x40@3x.png
--------------------------------------------------------------------------------
/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-60x60@2x.png
--------------------------------------------------------------------------------
/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-60x60@3x.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #fff
4 | #000
5 |
6 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/android/keystores/BUCK:
--------------------------------------------------------------------------------
1 | keystore(
2 | name = "debug",
3 | properties = "debug.keystore.properties",
4 | store = "debug.keystore",
5 | visibility = [
6 | "PUBLIC",
7 | ],
8 | )
9 |
--------------------------------------------------------------------------------
/src/services/api.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import { SERVER_URL } from 'react-native-dotenv';
3 |
4 | const api = axios.create({
5 | baseURL: SERVER_URL,
6 | });
7 |
8 | export default api;
9 |
--------------------------------------------------------------------------------
/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-marketing-1024x1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/steniowagner/mindCast/HEAD/ios/mindCast/Images.xcassets/AppIcon.appiconset/Icon-marketing-1024x1024.png
--------------------------------------------------------------------------------
/flow-typed/npm/flow-bin_v0.x.x.js:
--------------------------------------------------------------------------------
1 | // flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583
2 | // flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x
3 |
4 | declare module 'flow-bin' {
5 | declare module.exports: string;
6 | }
7 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @format
3 | * @lint-ignore-every XPLATJSCOPYRIGHT1
4 | */
5 |
6 | import { AppRegistry } from 'react-native';
7 | import App from './src';
8 | import { name as appName } from './app.json';
9 |
10 | AppRegistry.registerComponent(appName, () => App);
11 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/background_splash.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/mindCast/AppDelegate.h:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) Facebook, Inc. and its affiliates.
3 | *
4 | * This source code is licensed under the MIT license found in the
5 | * LICENSE file in the root directory of this source tree.
6 | */
7 |
8 | #import
9 |
10 | @interface AppDelegate : UIResponder
11 |
12 | @property (nonatomic, strong) UIWindow *window;
13 |
14 | @end
15 |
--------------------------------------------------------------------------------
/ios/mindCast/Images.xcassets/logo.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "icon.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/src/config/ReactotronConfig.js:
--------------------------------------------------------------------------------
1 | import Reactotron from 'reactotron-react-native';
2 | import { reactotronRedux } from 'reactotron-redux';
3 | import sagaPlugin from 'reactotron-redux-saga';
4 |
5 | if (__DEV__) {
6 | const tron = Reactotron.configure({ host: '192.168.25.27' })
7 | .useReactNative()
8 | .use(reactotronRedux())
9 | .use(sagaPlugin())
10 | .connect();
11 |
12 | tron.clear();
13 |
14 | console.tron = tron;
15 | }
16 |
--------------------------------------------------------------------------------
/src/store/ducks/index.js:
--------------------------------------------------------------------------------
1 | import { combineReducers } from 'redux';
2 |
3 | import localPodcastsManager from './localPodcastsManager';
4 | import playlist from './playlist';
5 | import subject from './subject';
6 | import author from './author';
7 | import player from './player';
8 | import home from './home';
9 |
10 | export default combineReducers({
11 | localPodcastsManager,
12 | playlist,
13 | subject,
14 | author,
15 | player,
16 | home,
17 | });
18 |
--------------------------------------------------------------------------------
/ios/mindCast/main.m:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) Facebook, Inc. and its affiliates.
3 | *
4 | * This source code is licensed under the MIT license found in the
5 | * LICENSE file in the root directory of this source tree.
6 | */
7 |
8 | #import
9 |
10 | #import "AppDelegate.h"
11 |
12 | int main(int argc, char * argv[]) {
13 | @autoreleasepool {
14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/mindcast/SplashActivity.java:
--------------------------------------------------------------------------------
1 | package com.mindcast;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.v7.app.AppCompatActivity;
6 |
7 | public class SplashActivity extends AppCompatActivity {
8 | @Override
9 | protected void onCreate(Bundle savedInstance) {
10 | super.onCreate(savedInstance);
11 |
12 | Intent intent = new Intent(this, MainActivity.class);
13 | startActivity(intent);
14 | finish();
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/android/app/src/main/res/layout/launch_screen.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/src/components/screens/settings/about/SOCIAL_BUTTONS.js:
--------------------------------------------------------------------------------
1 | export default (SOCIAL_BUTTONS = [
2 | {
3 | color: '#0077B5',
4 | url: 'https://www.linkedin.com/in/steniowagner',
5 | iconName: 'linkedin',
6 | withPadingTop: false,
7 | },
8 | {
9 | color: '#333333',
10 | url: 'https://github.com/steniowagner',
11 | iconName: 'github-circle',
12 | withPadingTop: true,
13 | },
14 | {
15 | color: '#EA4C89',
16 | url: 'https://dribbble.com/steniowagner',
17 | iconName: 'dribbble',
18 | withPadingTop: true,
19 | },
20 | ]);
21 |
--------------------------------------------------------------------------------
/src/components/common/Icon.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 |
5 | import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
6 | import { withTheme } from 'styled-components';
7 |
8 | type Props = {
9 | color: ?string,
10 | theme: Object,
11 | name: string,
12 | size: number,
13 | };
14 |
15 | const Icon = ({
16 | theme, color, name, size,
17 | }: Props) => (
18 |
23 | );
24 |
25 | export default withTheme(Icon);
26 |
--------------------------------------------------------------------------------
/src/store/sagas/subject.js:
--------------------------------------------------------------------------------
1 | import { call, select, put } from 'redux-saga/effects';
2 |
3 | import { SERVER_URL } from 'react-native-dotenv';
4 | import api from '~/services/api';
5 |
6 | import { Creators as SubjectCreators } from '../ducks/subject';
7 |
8 | export function* getSubjectDetail({ payload }) {
9 | try {
10 | const { id } = payload;
11 |
12 | const { data } = yield call(api.get, `/categories/${id}`);
13 |
14 | yield put(SubjectCreators.getSubjectDetailSuccess(data));
15 | } catch (err) {
16 | yield put(SubjectCreators.getSubjectDetailFailure());
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/components/common/author-detail/components/SectionWrapper.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { View } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | const Wrapper = styled(View)`
8 | width: 100%;
9 | margin-vertical: ${({ theme }) => theme.metrics.extraLargeSize}px;
10 | padding-horizontal: ${({ theme }) => theme.metrics.largeSize}px;
11 | `;
12 |
13 | type Props = {
14 | children: Object,
15 | };
16 |
17 | const SectionWrapper = ({ children }: Props): Object => (
18 | {children}
19 | );
20 |
21 | export default SectionWrapper;
22 |
--------------------------------------------------------------------------------
/src/styles/index.js:
--------------------------------------------------------------------------------
1 | import metrics from './metrics';
2 | import colors from './colors';
3 |
4 | export default { metrics, colors };
5 |
6 | export const darkTheme = {
7 | secondaryColor: '#111',
8 | backgroundColor: '#222',
9 | textColor: '#FFF',
10 | subTextColor: 'rgba(255, 255, 255, 0.5)',
11 | androidToolbarColor: '#222',
12 | trendingAuthorsCard: '#222',
13 | };
14 |
15 | export const lightTheme = {
16 | secondaryColor: '#FFF',
17 | backgroundColor: '#F2F2F2',
18 | textColor: 'rgba(0, 0, 0, 0.8)',
19 | subTextColor: 'rgba(0, 0, 0, 0.4)',
20 | androidToolbarColor: '#F2F2F2',
21 | trendingAuthorsCard: '#FFF',
22 | };
23 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React, { Fragment } from 'react';
4 | import { Provider } from 'react-redux';
5 |
6 | import SoundComponent from './components/common/SoundComponent';
7 | import { ThemeContextProvider } from './ThemeContextProvider';
8 | import ApplicationNavigator from './routes';
9 | import store from './store';
10 |
11 | import './config/ReactotronConfig';
12 |
13 | const App = (): Object => (
14 |
17 |
18 |
19 |
20 |
21 |
22 | );
23 | export default App;
24 |
--------------------------------------------------------------------------------
/src/components/common/Loading.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { ActivityIndicator, View } from 'react-native';
5 |
6 | import styled from 'styled-components';
7 | import appStyles from '~/styles';
8 |
9 | const LoadingWrapper = styled(View)`
10 | flex: 1;
11 | justify-content: center;
12 | align-items: center;
13 | `;
14 |
15 | type Props = {
16 | size: ?string,
17 | };
18 |
19 | const Loading = ({ size }: Props): Object => (
20 |
21 |
25 |
26 | );
27 |
28 | export default Loading;
29 |
--------------------------------------------------------------------------------
/src/store/index.js:
--------------------------------------------------------------------------------
1 | import { createStore, applyMiddleware } from 'redux';
2 | import createSagaMiddleware from 'redux-saga';
3 |
4 | import reducers from './ducks';
5 | import sagas from './sagas';
6 |
7 | import '~/config/ReactotronConfig';
8 |
9 | const sagaMonitor = __DEV__ ? console.tron.createSagaMonitor() : null;
10 | const sagaMiddleware = createSagaMiddleware({ sagaMonitor });
11 |
12 | const middleware = [sagaMiddleware];
13 |
14 | const createAppropriateStore = __DEV__ ? console.tron.createStore : createStore;
15 | const store = createAppropriateStore(reducers, applyMiddleware(...middleware));
16 |
17 | sagaMiddleware.run(sagas);
18 |
19 | export default store;
20 |
--------------------------------------------------------------------------------
/src/components/screens/interests/Interests.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React, { Component } from 'react';
4 |
5 | import InterestsComponent from '~/components/common/interests/Interests';
6 | import CONSTANTS from '~/utils/CONSTANTS';
7 |
8 | type Props = {
9 | navigation: Object,
10 | };
11 |
12 | class Interests extends Component {
13 | componentDidMount() {
14 | const { navigation } = this.props;
15 |
16 | navigation.setParams({
17 | [CONSTANTS.PARAMS.HEADER_ACTION]: () => navigation.navigate(CONSTANTS.ROUTES.MAIN_STACK),
18 | });
19 | }
20 |
21 | render() {
22 | return ;
23 | }
24 | }
25 |
26 | export default Interests;
27 |
--------------------------------------------------------------------------------
/src/styles/colors.js:
--------------------------------------------------------------------------------
1 | export default {
2 | darkText: 'rgba(0, 0, 0, 0.8)',
3 | subText: 'rgba(0, 0, 0, 0.5)',
4 | subTextWhite: '#bbb',
5 | darkLayer: 'rgba(0, 0, 0, 0.6)',
6 | lighDarkLayer: 'rgba(0, 0, 0, 0.45)',
7 | progressiveImageForeground: 'rgba(242, 242, 242, 0.5)',
8 | primaryColor: '#EF010B',
9 | primaryColorAlpha: 'rgba(239, 1, 11, 0.2)',
10 | interestSelectedColor: 'rgba(239, 1, 11, 0.6)',
11 | yellow: '#F8C330',
12 | white: '#FFF',
13 | lightSecondaryColor: '#222',
14 | dark: '#111',
15 | facebook: '#3B5998',
16 | googlePlus: '#DD4B39',
17 | black: '#000',
18 | lightDark: 'rgba(0, 0, 0, 0.4)',
19 | transparentGray: 'rgba(218, 218, 218, 0.8)',
20 | };
21 |
--------------------------------------------------------------------------------
/android/app/build_defs.bzl:
--------------------------------------------------------------------------------
1 | """Helper definitions to glob .aar and .jar targets"""
2 |
3 | def create_aar_targets(aarfiles):
4 | for aarfile in aarfiles:
5 | name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")]
6 | lib_deps.append(":" + name)
7 | android_prebuilt_aar(
8 | name = name,
9 | aar = aarfile,
10 | )
11 |
12 | def create_jar_targets(jarfiles):
13 | for jarfile in jarfiles:
14 | name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")]
15 | lib_deps.append(":" + name)
16 | prebuilt_jar(
17 | name = name,
18 | binary_jar = jarfile,
19 | )
20 |
--------------------------------------------------------------------------------
/src/components/common/player/components/bottom-player-options/components/AddPodcastPlaylist.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 |
5 | import Icon from '~/components/common/Icon';
6 | import Button from './Button';
7 | import appStyles from '~/styles';
8 |
9 | type Props = {
10 | onToggleAddPlaylistModal: Function,
11 | };
12 |
13 | const AddPodcastPlaylist = ({ onToggleAddPlaylistModal }: Props): Object => (
14 |
23 | );
24 |
25 | export default AddPodcastPlaylist;
26 |
--------------------------------------------------------------------------------
/src/components/common/player/components/bottom-player-options/components/Button.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { TouchableOpacity } from 'react-native';
5 |
6 | import appStyles from '~/styles';
7 |
8 | type Props = {
9 | onPress: Function,
10 | children: Object,
11 | };
12 |
13 | const Button = ({ onPress, children }: Props): Object => (
14 |
23 | {children}
24 |
25 | );
26 |
27 | export default Button;
28 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | 'module:metro-react-native-babel-preset',
4 | 'module:react-native-dotenv',
5 | ],
6 | plugins: [
7 | ['@babel/plugin-transform-flow-strip-types'],
8 | ['@babel/plugin-proposal-class-properties', { loose: true }],
9 | [
10 | 'babel-plugin-root-import',
11 | {
12 | rootPathSuffix: 'src',
13 | },
14 | ],
15 | ],
16 | env: {
17 | production: {
18 | plugins: [
19 | ['@babel/plugin-transform-flow-strip-types'],
20 | ['@babel/plugin-proposal-class-properties', { loose: true }],
21 | [
22 | 'babel-plugin-root-import',
23 | {
24 | rootPathSuffix: 'src',
25 | },
26 | ],
27 | ],
28 | },
29 | },
30 | };
31 |
--------------------------------------------------------------------------------
/src/components/common/ScreenTitle.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { Platform, Text } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | const Title = styled(Text)`
8 | width: 100%;
9 | margin-top: ${({ theme }) => {
10 | const percentage = Platform.OS === 'android' ? '8%' : '15%';
11 | return theme.metrics.getWidthFromDP(percentage);
12 | }}px;
13 | margin-left: ${({ theme }) => theme.metrics.largeSize}px;
14 | font-size: ${({ theme }) => theme.metrics.extraLargeSize * 1.7}px;
15 | font-family: CircularStd-Black;
16 | color: ${({ theme }) => theme.colors.textColor};
17 | `;
18 |
19 | type Props = {
20 | title: string,
21 | };
22 |
23 | const ScreenTitle = ({ title }: Props) => {title};
24 |
25 | export default ScreenTitle;
26 |
--------------------------------------------------------------------------------
/src/components/common/SwipeOutButton.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { View } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | import Icon from '~/components/common/Icon';
8 | import appStyles from '~/styles';
9 |
10 | const Wrapper = styled(View)`
11 | width: 100%;
12 | height: 100%;
13 | justify-content: center;
14 | align-items: center;
15 | background-color: ${({ color }) => color};
16 | `;
17 |
18 | type Props = {
19 | color: string,
20 | icon: string,
21 | };
22 |
23 | const SwipeOutButton = ({ color, icon }: Props): Object => (
24 |
27 |
32 |
33 | );
34 |
35 | export default SwipeOutButton;
36 |
--------------------------------------------------------------------------------
/src/store/sagas/utils/parseParams.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | const parseParams = (params: Object): string => {
4 | const keys = Object.keys(params);
5 | let options = '';
6 |
7 | keys.forEach((key) => {
8 | const isParamTypeObject = typeof params[key] === 'object';
9 | const isParamTypeArray = isParamTypeObject && params[key].length >= 0;
10 |
11 | if (!isParamTypeObject) {
12 | options += `${key}=${params[key]}&`;
13 | }
14 |
15 | if (isParamTypeObject && isParamTypeArray) {
16 | if (params[key].length === 0) {
17 | options += `${key}=all&`;
18 | }
19 |
20 | params[key].forEach((element) => {
21 | options += `${key}=${element}&`;
22 | });
23 | }
24 | });
25 |
26 | return options ? options.slice(0, -1) : options;
27 | };
28 |
29 | export default parseParams;
30 |
--------------------------------------------------------------------------------
/src/utils/isEqualsOrLargestThanIphoneX.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import { Dimensions, Platform } from 'react-native';
4 |
5 | const screenWidth = Dimensions.get('window').width;
6 | const screenHeight = Dimensions.get('window').height;
7 |
8 | const IPHONEX_WIDTH = 375;
9 | const IPHONEX_HEIGHT = 812;
10 |
11 | const isEqualsOrLargestThanIphoneX = (): boolean => {
12 | const isEqualsOrLargestThanIphoneXInPortraitMode = screenHeight >= IPHONEX_HEIGHT && screenWidth >= IPHONEX_WIDTH;
13 | const isEqualsOrLargestThanIphoneXInLandscapeMode = screenHeight >= IPHONEX_WIDTH && screenWidth >= IPHONEX_HEIGHT;
14 |
15 | return (
16 | Platform.OS === 'ios'
17 | && (isEqualsOrLargestThanIphoneXInPortraitMode
18 | || isEqualsOrLargestThanIphoneXInLandscapeMode)
19 | );
20 | };
21 |
22 | export default isEqualsOrLargestThanIphoneX;
23 |
--------------------------------------------------------------------------------
/ios/mindCastTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/components/common/author-detail/components/AuthorName.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { View, Text } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | const Wrapper = styled(View)`
8 | width: 100%;
9 | height: ${({ theme }) => theme.metrics.getHeightFromDP('30%')};
10 | justify-content: flex-end;
11 | padding-right: ${({ theme }) => theme.metrics.getWidthFromDP('35%')}px;
12 | `;
13 |
14 | const Name = styled(Text)`
15 | font-family: CircularStd-Black;
16 | font-size: ${({ theme }) => theme.metrics.getWidthFromDP('10%')}px;
17 | color: ${({ theme }) => theme.colors.textColor};
18 | `;
19 |
20 | type Props = {
21 | name: string,
22 | };
23 |
24 | const AuthorName = ({ name }: Props) => (
25 |
26 | {name}
27 |
28 | );
29 |
30 | export default AuthorName;
31 |
--------------------------------------------------------------------------------
/src/components/common/player/components/bottom-player-options/components/ShufflePlaylist.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 |
5 | import Icon from '~/components/common/Icon';
6 | import appStyles from '~/styles';
7 | import Button from './Button';
8 |
9 | type Props = {
10 | shouldShufflePlaylist: boolean,
11 | shufflePlaylist: Function,
12 | };
13 |
14 | const ShufflePlaylist = ({
15 | shouldShufflePlaylist,
16 | shufflePlaylist,
17 | }: Props): Object => (
18 |
31 | );
32 |
33 | export default ShufflePlaylist;
34 |
--------------------------------------------------------------------------------
/src/components/screens/login/components/DefaultText.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { Text } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | const TextStyle = styled(Text)`
8 | margin-right: ${({ withMarginRight, theme }) => (withMarginRight ? theme.metrics.smallSize : 0)}px;
9 | font-size: ${({ theme }) => theme.metrics.getWidthFromDP('4.5%')}px;
10 | font-family: CircularStd-Bold;
11 | color: ${({ color }) => color};
12 | text-align: center;
13 | `;
14 |
15 | type Props = {
16 | withMarginRight: ?boolean,
17 | color: string,
18 | text: string,
19 | };
20 |
21 | const DefaultText = ({ withMarginRight, color, text }: Props): Object => (
22 |
26 | {text}
27 |
28 | );
29 |
30 | export default DefaultText;
31 |
--------------------------------------------------------------------------------
/ios/mindCast-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 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/components/common/author-detail/components/AboutSection.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { View, Text } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | import SectionTitle from '~/components/common/SectionTitle';
8 |
9 | const Wrapper = styled(View)`
10 | width: 100%;
11 | `;
12 |
13 | const About = styled(Text)`
14 | margin-top: ${({ theme }) => theme.metrics.largeSize}px;
15 | font-size: ${({ theme }) => theme.metrics.largeSize * 1.2}px;
16 | font-family: CircularStd-Medium;
17 | color: ${({ theme }) => theme.colors.textColor};
18 | `;
19 |
20 | type Props = {
21 | about: string,
22 | };
23 |
24 | const AboutSection = ({ about }: Props): Object => (
25 |
26 |
29 | {about}
30 |
31 | );
32 |
33 | export default AboutSection;
34 |
--------------------------------------------------------------------------------
/src/components/common/SectionTitle.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { View, Text } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | const Title = styled(Text)`
8 | width: 100%;
9 | margin-bottom: ${({ theme }) => theme.metrics.mediumSize}px;
10 | font-size: ${({ theme }) => theme.metrics.extraLargeSize * 1.2}px;
11 | font-family: CircularStd-Bold;
12 | color: ${({ theme }) => theme.colors.textColor};
13 | `;
14 |
15 | const Line = styled(View)`
16 | height: ${({ theme }) => theme.metrics.getHeightFromDP('0.5%')}px;
17 | width: ${({ theme }) => theme.metrics.extraLargeSize * 2}px;
18 | background-color: ${({ theme }) => theme.colors.primaryColor};
19 | `;
20 |
21 | type Props = {
22 | title: string,
23 | };
24 |
25 | const SectionTitle = ({ title }: Props): Object => (
26 |
27 | {title}
28 |
29 |
30 | );
31 |
32 | export default SectionTitle;
33 |
--------------------------------------------------------------------------------
/src/components/common/Switch.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { Platform, Switch } from 'react-native';
5 | import appStyles from '~/styles';
6 |
7 | type Props = {
8 | onToggle: Function,
9 | value: boolean,
10 | };
11 |
12 | const CustomSwitch = ({ onToggle, value }: Props): Object => {
13 | const thumbTintColor = value
14 | ? appStyles.colors.primaryColor
15 | : appStyles.colors.white;
16 |
17 | const trackColor = {
18 | true:
19 | Platform.OS === 'android'
20 | ? appStyles.colors.primaryColorAlpha
21 | : appStyles.colors.primaryColor,
22 | false: Platform.OS === 'android' ? appStyles.colors.subTextWhite : '',
23 | };
24 |
25 | return (
26 |
32 | );
33 | };
34 |
35 | export default CustomSwitch;
36 |
--------------------------------------------------------------------------------
/src/components/screens/login/components/BackgroundImage.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { View } from 'react-native';
5 | import FastImage from 'react-native-fast-image';
6 | import styled from 'styled-components';
7 |
8 | const Wrapper = styled(View)`
9 | width: 100%;
10 | height: 100%;
11 | position: absolute;
12 | `;
13 |
14 | const DarkLayer = styled(View)`
15 | width: 100%;
16 | height: 100%;
17 | position: absolute;
18 | background-color: ${({ theme }) => theme.colors.darkLayer};
19 | `;
20 |
21 | const Image = styled(FastImage).attrs({
22 | source: {
23 | uri:
24 | 'https://s3-sa-east-1.amazonaws.com/mind-cast/images/background-image.jpg',
25 | },
26 | })`
27 | position: absolute;
28 | width: 100%;
29 | height: 100%;
30 | `;
31 |
32 | const BackgroundImage = (): Object => (
33 |
34 |
35 |
36 |
37 | );
38 |
39 | export default BackgroundImage;
40 |
--------------------------------------------------------------------------------
/src/components/screens/library/Library.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React, { Component } from 'react';
4 | import { View } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | import ScreenTitle from '~/components/common/ScreenTitle';
8 | import Playlists from './components/playlists/Playlists';
9 | import Sections from './components/sections/Sections';
10 | import CONSTANTS from '~/utils/CONSTANTS';
11 |
12 | const Wrapper = styled(View)`
13 | width: 100%;
14 | height: 100%;
15 | background-color: ${({ theme }) => theme.colors.secondaryColor};
16 | `;
17 |
18 | type Props = {
19 | LOCAL_STACK_ROUTES: Object,
20 | navigation: Object,
21 | };
22 |
23 | const Library = ({ LOCAL_STACK_ROUTES, navigation }: Props): Object => (
24 |
25 |
28 |
32 |
33 | );
34 |
35 | export default Library;
36 |
--------------------------------------------------------------------------------
/flow-typed/npm/babel-jest_vx.x.x.js:
--------------------------------------------------------------------------------
1 | // flow-typed signature: d962e1f20379146a7bcaf03c5b32068b
2 | // flow-typed version: <>/babel-jest_v24.1.0/flow_v0.92.1
3 |
4 | /**
5 | * This is an autogenerated libdef stub for:
6 | *
7 | * 'babel-jest'
8 | *
9 | * Fill this stub out by replacing all the `any` types.
10 | *
11 | * Once filled out, we encourage you to share your work with the
12 | * community by sending a pull request to:
13 | * https://github.com/flowtype/flow-typed
14 | */
15 |
16 | declare module 'babel-jest' {
17 | declare module.exports: any;
18 | }
19 |
20 | /**
21 | * We include stubs for each file inside this npm package in case you need to
22 | * require those files directly. Feel free to delete any files that aren't
23 | * needed.
24 | */
25 | declare module 'babel-jest/build/index' {
26 | declare module.exports: any;
27 | }
28 |
29 | // Filename aliases
30 | declare module 'babel-jest/build/index.js' {
31 | declare module.exports: $Exports<'babel-jest/build/index'>;
32 | }
33 |
--------------------------------------------------------------------------------
/flow-typed/npm/babel-core_vx.x.x.js:
--------------------------------------------------------------------------------
1 | // flow-typed signature: 3852c7fdc189c8b0f361ad03d4368c5b
2 | // flow-typed version: <>/babel-core_v^7.0.0-bridge.0/flow_v0.92.1
3 |
4 | /**
5 | * This is an autogenerated libdef stub for:
6 | *
7 | * 'babel-core'
8 | *
9 | * Fill this stub out by replacing all the `any` types.
10 | *
11 | * Once filled out, we encourage you to share your work with the
12 | * community by sending a pull request to:
13 | * https://github.com/flowtype/flow-typed
14 | */
15 |
16 | declare module 'babel-core' {
17 | declare module.exports: any;
18 | }
19 |
20 | /**
21 | * We include stubs for each file inside this npm package in case you need to
22 | * require those files directly. Feel free to delete any files that aren't
23 | * needed.
24 | */
25 |
26 | // Filename aliases
27 | declare module 'babel-core/index' {
28 | declare module.exports: $Exports<'babel-core'>;
29 | }
30 | declare module 'babel-core/index.js' {
31 | declare module.exports: $Exports<'babel-core'>;
32 | }
33 |
--------------------------------------------------------------------------------
/flow-typed/npm/reactotron-redux_vx.x.x.js:
--------------------------------------------------------------------------------
1 | // flow-typed signature: 2396aaa22bd56cb09a6a49089d29dee3
2 | // flow-typed version: <>/reactotron-redux_v^2.1.3/flow_v0.92.1
3 |
4 | /**
5 | * This is an autogenerated libdef stub for:
6 | *
7 | * 'reactotron-redux'
8 | *
9 | * Fill this stub out by replacing all the `any` types.
10 | *
11 | * Once filled out, we encourage you to share your work with the
12 | * community by sending a pull request to:
13 | * https://github.com/flowtype/flow-typed
14 | */
15 |
16 | declare module 'reactotron-redux' {
17 | declare module.exports: any;
18 | }
19 |
20 | /**
21 | * We include stubs for each file inside this npm package in case you need to
22 | * require those files directly. Feel free to delete any files that aren't
23 | * needed.
24 | */
25 | declare module 'reactotron-redux/dist/index' {
26 | declare module.exports: any;
27 | }
28 |
29 | // Filename aliases
30 | declare module 'reactotron-redux/dist/index.js' {
31 | declare module.exports: $Exports<'reactotron-redux/dist/index'>;
32 | }
33 |
--------------------------------------------------------------------------------
/src/store/sagas/author.js:
--------------------------------------------------------------------------------
1 | import {
2 | call, select, put, delay,
3 | } from 'redux-saga/effects';
4 |
5 | import { Creators as AuthorCreators } from '../ducks/author';
6 | import parseParams from './utils/parseParams';
7 | import api from '~/services/api';
8 |
9 | export function* searchAuthorByName({ payload }) {
10 | try {
11 | const { name } = payload;
12 |
13 | const { data } = yield call(api.get, '/authors/filter', {
14 | paramsSerializer: params => parseParams(params),
15 | params: { name },
16 | });
17 |
18 | yield put(AuthorCreators.searchAuthorByNameSuccess(data.authors));
19 | } catch (err) {
20 | yield put(AuthorCreators.searchAuthorByNameFailure());
21 | }
22 | }
23 |
24 | export function* getAuthorById({ payload }) {
25 | try {
26 | const { id } = payload;
27 |
28 | const { data } = yield call(api.get, `/authors/${id}`);
29 |
30 | yield put(AuthorCreators.getAuthorByIdSuccess(data.author));
31 | } catch (err) {
32 | yield put(AuthorCreators.getAuthorByIdFailure());
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/components/common/player/components/BackgroundImage.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { View, Image } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | const Container = styled(View)`
8 | width: 100%;
9 | height: 100%;
10 | position: absolute;
11 | background-color: ${({ theme }) => theme.colors.darkLayer};
12 | `;
13 |
14 | const BlurredImage = styled(Image).attrs(({ imageURL }) => ({
15 | source: { uri: imageURL },
16 | resize: 'cover',
17 | blurRadius: 1,
18 | }))`
19 | width: 100%;'
20 | height: 100%;
21 | `;
22 |
23 | const BlackLayer = styled(View)`
24 | width: 100%;
25 | height: 100%;
26 | position: absolute;
27 | background-color: ${({ theme }) => theme.colors.darkLayer};
28 | `;
29 |
30 | type Props = {
31 | imageURL: string,
32 | };
33 |
34 | const BackgroundImage = ({ imageURL }: Props): Object => (
35 |
36 |
39 |
40 |
41 | );
42 |
43 | export default BackgroundImage;
44 |
--------------------------------------------------------------------------------
/src/components/common/player/components/PodcastImage.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { View } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | import ProgressiveImage from '~/components/common/ProgressiveImage';
8 |
9 | const Wrapper = styled(View)`
10 | width: 100%;
11 | justify-content: center;
12 | align-content: center;
13 | `;
14 |
15 | const ImageContainer = styled(View)`
16 | width: 100%;
17 | height: ${({ theme }) => theme.metrics.getHeightFromDP('35%')}px;
18 | padding-horizontal: ${({ theme }) => theme.metrics.getWidthFromDP('15%')}px;
19 | align-self: center;
20 | `;
21 |
22 | type Props = {
23 | thumbnailImageURL: string,
24 | imageURL: string,
25 | };
26 |
27 | const PodcastImage = ({ thumbnailImageURL, imageURL }: Props): Object => (
28 |
29 |
30 |
34 |
35 |
36 | );
37 |
38 | export default PodcastImage;
39 |
--------------------------------------------------------------------------------
/flow-typed/npm/reactotron-redux-saga_vx.x.x.js:
--------------------------------------------------------------------------------
1 | // flow-typed signature: dd74c53eaa36b17213ee6d79bb810107
2 | // flow-typed version: <>/reactotron-redux-saga_v^4.0.0/flow_v0.92.1
3 |
4 | /**
5 | * This is an autogenerated libdef stub for:
6 | *
7 | * 'reactotron-redux-saga'
8 | *
9 | * Fill this stub out by replacing all the `any` types.
10 | *
11 | * Once filled out, we encourage you to share your work with the
12 | * community by sending a pull request to:
13 | * https://github.com/flowtype/flow-typed
14 | */
15 |
16 | declare module 'reactotron-redux-saga' {
17 | declare module.exports: any;
18 | }
19 |
20 | /**
21 | * We include stubs for each file inside this npm package in case you need to
22 | * require those files directly. Feel free to delete any files that aren't
23 | * needed.
24 | */
25 | declare module 'reactotron-redux-saga/dist/index' {
26 | declare module.exports: any;
27 | }
28 |
29 | // Filename aliases
30 | declare module 'reactotron-redux-saga/dist/index.js' {
31 | declare module.exports: $Exports<'reactotron-redux-saga/dist/index'>;
32 | }
33 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # OSX
2 | #
3 | .DS_Store
4 |
5 | # Xcode
6 | #
7 | build/
8 | *.pbxuser
9 | !default.pbxuser
10 | *.mode1v3
11 | !default.mode1v3
12 | *.mode2v3
13 | !default.mode2v3
14 | *.perspectivev3
15 | !default.perspectivev3
16 | xcuserdata
17 | *.xccheckout
18 | *.moved-aside
19 | DerivedData
20 | *.hmap
21 | *.ipa
22 | *.xcuserstate
23 | project.xcworkspace
24 |
25 | # Android/IntelliJ
26 | #
27 | build/
28 | .idea
29 | .gradle
30 | local.properties
31 | *.iml
32 |
33 | # node.js
34 | #
35 | node_modules/
36 | npm-debug.log
37 | yarn-error.log
38 |
39 | # BUCK
40 | buck-out/
41 | \.buckd/
42 | *.keystore
43 |
44 | # dotenv production
45 | .env.production
46 |
47 | # fastlane
48 | #
49 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
50 | # screenshots whenever they are needed.
51 | # For more information about the recommended setup visit:
52 | # https://docs.fastlane.tools/best-practices/source-control/
53 |
54 | */fastlane/report.xml
55 | */fastlane/Preview.html
56 | */fastlane/screenshots
57 |
58 | # Bundle artifact
59 | *.jsbundle
60 |
--------------------------------------------------------------------------------
/flow-typed/npm/reactotron-react-native_vx.x.x.js:
--------------------------------------------------------------------------------
1 | // flow-typed signature: b29dac161cf068a52b547e4ec86e3b00
2 | // flow-typed version: <>/reactotron-react-native_v^2.1.5/flow_v0.92.1
3 |
4 | /**
5 | * This is an autogenerated libdef stub for:
6 | *
7 | * 'reactotron-react-native'
8 | *
9 | * Fill this stub out by replacing all the `any` types.
10 | *
11 | * Once filled out, we encourage you to share your work with the
12 | * community by sending a pull request to:
13 | * https://github.com/flowtype/flow-typed
14 | */
15 |
16 | declare module 'reactotron-react-native' {
17 | declare module.exports: any;
18 | }
19 |
20 | /**
21 | * We include stubs for each file inside this npm package in case you need to
22 | * require those files directly. Feel free to delete any files that aren't
23 | * needed.
24 | */
25 | declare module 'reactotron-react-native/dist/index' {
26 | declare module.exports: any;
27 | }
28 |
29 | // Filename aliases
30 | declare module 'reactotron-react-native/dist/index.js' {
31 | declare module.exports: $Exports<'reactotron-react-native/dist/index'>;
32 | }
33 |
--------------------------------------------------------------------------------
/src/components/common/SectionWithButton.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { View } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | import DefaultButton from './DefaultButton';
8 | import SectionTitle from './SectionTitle';
9 |
10 | const ContentWrapper = styled(View)`
11 | width: 100%;
12 | flex-direction: row;
13 | justify-content: space-between;
14 | align-items: center;
15 | padding-horizontal: ${({ theme }) => theme.metrics.largeSize}px;
16 | `;
17 |
18 | type Props = {
19 | sectionTitle: string,
20 | buttonSize: string,
21 | buttonText: string,
22 | onPress: Function,
23 | };
24 |
25 | const SectionWithButton = ({
26 | sectionTitle,
27 | buttonText,
28 | buttonSize,
29 | onPress,
30 | }: Props): Object => (
31 |
32 |
35 |
41 |
42 | );
43 |
44 | export default SectionWithButton;
45 |
--------------------------------------------------------------------------------
/src/utils/AsyncStorageManager.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import { AsyncStorage } from 'react-native';
4 | import CONSTANTS from '~/utils/CONSTANTS';
5 |
6 | export const getItemFromStorage = async (
7 | key: string,
8 | defaultValue: any,
9 | ): any => {
10 | try {
11 | const valueFromStorage = await AsyncStorage.getItem(
12 | `${CONSTANTS.KEYS.APP_STORAGE_KEY}:${key}`,
13 | );
14 |
15 | return valueFromStorage || defaultValue;
16 | } catch (error) {
17 | console.log(error);
18 | }
19 |
20 | return defaultValue;
21 | };
22 |
23 | export const persistItemInStorage = async (
24 | key: string,
25 | value: any,
26 | ): Promise => {
27 | try {
28 | await AsyncStorage.setItem(
29 | `${CONSTANTS.KEYS.APP_STORAGE_KEY}:${key}`,
30 | JSON.stringify(value),
31 | );
32 | } catch (err) {
33 | console.log(err);
34 | }
35 | };
36 |
37 | export const removeItemFromStorage = async (key: string) => {
38 | try {
39 | await AsyncStorage.removeItem(`${CONSTANTS.KEYS.APP_STORAGE_KEY}:${key}`);
40 | } catch (err) {
41 | console.log(err);
42 | }
43 | };
44 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
19 |
20 | MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
21 | MYAPP_RELEASE_KEY_ALIAS=my-key-alias
22 | MYAPP_RELEASE_STORE_PASSWORD=qwpo10xl
23 | MYAPP_RELEASE_KEY_PASSWORD=qwpo10xl
24 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Stenio Wagner
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | ext {
5 | buildToolsVersion = "28.0.2"
6 | minSdkVersion = 16
7 | compileSdkVersion = 28
8 | targetSdkVersion = 27
9 | supportLibVersion = "28.0.0"
10 | }
11 | repositories {
12 | google()
13 | jcenter()
14 | }
15 | dependencies {
16 | classpath 'com.android.tools.build:gradle:3.2.1'
17 |
18 | // NOTE: Do not place your application dependencies here; they belong
19 | // in the individual module build.gradle files
20 | }
21 | }
22 |
23 | allprojects {
24 | repositories {
25 | mavenLocal()
26 | google()
27 | jcenter()
28 | maven {
29 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
30 | url "$rootDir/../node_modules/react-native/android"
31 | }
32 | }
33 | }
34 |
35 |
36 | task wrapper(type: Wrapper) {
37 | gradleVersion = '4.7'
38 | distributionUrl = distributionUrl.replace("bin", "all")
39 | }
40 |
--------------------------------------------------------------------------------
/src/components/common/HeaderActionButton.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { TouchableOpacity, View } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | import Icon from '~/components/common/Icon';
8 | import appStyles from '~/styles';
9 |
10 | const Wrapper = styled(View)`
11 | justify-content: center;
12 | align-items: center;
13 | padding-top: 3px;
14 | margin-right: ${({ theme }) => theme.metrics.largeSize}px;
15 | `;
16 |
17 | type Props = {
18 | onPress: Function,
19 | color: string,
20 | icon: string,
21 | };
22 |
23 | const HeaderActionButton = ({ onPress, color, icon }: Props): Object => (
24 |
25 |
34 |
39 |
40 |
41 | );
42 |
43 | export default HeaderActionButton;
44 |
--------------------------------------------------------------------------------
/src/store/ducks/home.js:
--------------------------------------------------------------------------------
1 | export const Types = {
2 | GET_HOME_REQUEST: 'subject/GET_HOME_REQUEST',
3 | GET_HOME_SUCCESS: 'subject/GET_HOME_SUCCESS',
4 | GET_HOME_ERROR: 'subject/GET_HOME_ERROR',
5 | };
6 |
7 | const INITIAL_STATE = {
8 | loading: true,
9 | error: false,
10 | data: null,
11 | };
12 |
13 | export const Creators = {
14 | getHome: () => ({
15 | type: Types.GET_HOME_REQUEST,
16 | }),
17 |
18 | getHomeSuccess: data => ({
19 | type: Types.GET_HOME_SUCCESS,
20 | payload: { data },
21 | }),
22 |
23 | getHomeFailure: () => ({
24 | type: Types.GET_HOME_ERROR,
25 | }),
26 | };
27 |
28 | const subject = (state = INITIAL_STATE, { type, payload }) => {
29 | switch (type) {
30 | case Types.GET_HOME_REQUEST:
31 | return {
32 | ...INITIAL_STATE,
33 | };
34 |
35 | case Types.GET_HOME_SUCCESS:
36 | return {
37 | ...state,
38 | data: payload.data,
39 | loading: false,
40 | };
41 |
42 | case Types.GET_HOME_ERROR:
43 | return {
44 | ...state,
45 | loading: false,
46 | error: true,
47 | };
48 |
49 | default:
50 | return state;
51 | }
52 | };
53 |
54 | export default subject;
55 |
--------------------------------------------------------------------------------
/src/store/sagas/home.js:
--------------------------------------------------------------------------------
1 | import {
2 | call, select, delay, put,
3 | } from 'redux-saga/effects';
4 |
5 | import api from '~/services/api';
6 | import { SERVER_URL } from 'react-native-dotenv';
7 |
8 | import { getItemFromStorage } from '../../utils/AsyncStorageManager';
9 | import { Creators as HomeCreators } from '../ducks/home';
10 | import CONSTANTS from '../../utils/CONSTANTS';
11 | import parseParams from './utils/parseParams';
12 |
13 | export function* getHome() {
14 | try {
15 | const rawInterests = yield call(
16 | getItemFromStorage,
17 | CONSTANTS.KEYS.INTERESTS_STORAGE_KEY,
18 | [],
19 | );
20 |
21 | const interests = typeof rawInterests === 'string'
22 | ? JSON.parse(rawInterests)
23 | : rawInterests;
24 |
25 | const interestsSelected = interests
26 | .filter(interest => interest.isSelected)
27 | .map(interest => interest.title.toLowerCase());
28 |
29 | const { data } = yield call(api.get, '/home', {
30 | paramsSerializer: params => parseParams(params),
31 | params: { categories: interestsSelected },
32 | });
33 |
34 | yield put(HomeCreators.getHomeSuccess(data));
35 | } catch (err) {
36 | yield put(HomeCreators.getHomeFailure());
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/mindcast/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.mindcast;
2 |
3 | import android.os.Bundle;
4 | import com.facebook.react.ReactActivity;
5 | import com.facebook.react.ReactActivityDelegate;
6 | import com.facebook.react.ReactRootView;
7 | import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
8 | import org.devio.rn.splashscreen.SplashScreen;
9 |
10 | public class MainActivity extends ReactActivity {
11 | @Override
12 | protected void onCreate(Bundle savedInstanceState) {
13 | SplashScreen.show(this);
14 | super.onCreate(savedInstanceState);
15 | }
16 |
17 | /**
18 | * Returns the name of the main component registered from JavaScript.
19 | * This is used to schedule rendering of the component.
20 | */
21 | @Override
22 | protected String getMainComponentName() {
23 | return "mindCast";
24 | }
25 |
26 | @Override
27 | protected ReactActivityDelegate createReactActivityDelegate() {
28 | return new ReactActivityDelegate(this, getMainComponentName()) {
29 | @Override
30 | protected ReactRootView createRootView() {
31 | return new RNGestureHandlerEnabledRootView(MainActivity.this);
32 | }
33 | };
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/styles/metrics.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import { Dimensions, Platform, PixelRatio } from 'react-native';
4 |
5 | const { width, height } = Dimensions.get('window');
6 |
7 | const getWidthFromDP = (widthPercentage: string): number => {
8 | const percentageDesired = parseFloat(widthPercentage);
9 | const widthPercentageToDP = PixelRatio.roundToNearestPixel(
10 | (width * percentageDesired) / 100,
11 | );
12 |
13 | return widthPercentageToDP;
14 | };
15 |
16 | const getHeightFromDP = (heightPercentage: string): number => {
17 | const percentageDesired = parseFloat(heightPercentage);
18 | const heightPercentageToDP = PixelRatio.roundToNearestPixel(
19 | (height * percentageDesired) / 100,
20 | );
21 |
22 | return heightPercentageToDP;
23 | };
24 |
25 | export default {
26 | navigationHeaderFontSize: Platform.OS === 'ios' ? 17 : 19,
27 | navigationHeaderHeight: Platform.OS === 'ios' ? 64 : 54,
28 | statusBarHeight: Platform.OS === 'ios' ? 20 : 0,
29 | extraSmallSize: getWidthFromDP('1%'),
30 | smallSize: getWidthFromDP('2%'),
31 | mediumSize: getWidthFromDP('3%'),
32 | largeSize: getWidthFromDP('4%'),
33 | extraLargeSize: getWidthFromDP('5%'),
34 | getWidthFromDP,
35 | getHeightFromDP,
36 | width,
37 | height,
38 | };
39 |
--------------------------------------------------------------------------------
/flow-typed/npm/prettier-eslint_vx.x.x.js:
--------------------------------------------------------------------------------
1 | // flow-typed signature: 16b8620cf8cc56c172f40336bb734c42
2 | // flow-typed version: <>/prettier-eslint_v^8.8.2/flow_v0.92.1
3 |
4 | /**
5 | * This is an autogenerated libdef stub for:
6 | *
7 | * 'prettier-eslint'
8 | *
9 | * Fill this stub out by replacing all the `any` types.
10 | *
11 | * Once filled out, we encourage you to share your work with the
12 | * community by sending a pull request to:
13 | * https://github.com/flowtype/flow-typed
14 | */
15 |
16 | declare module 'prettier-eslint' {
17 | declare module.exports: any;
18 | }
19 |
20 | /**
21 | * We include stubs for each file inside this npm package in case you need to
22 | * require those files directly. Feel free to delete any files that aren't
23 | * needed.
24 | */
25 | declare module 'prettier-eslint/dist/index' {
26 | declare module.exports: any;
27 | }
28 |
29 | declare module 'prettier-eslint/dist/utils' {
30 | declare module.exports: any;
31 | }
32 |
33 | // Filename aliases
34 | declare module 'prettier-eslint/dist/index.js' {
35 | declare module.exports: $Exports<'prettier-eslint/dist/index'>;
36 | }
37 | declare module 'prettier-eslint/dist/utils.js' {
38 | declare module.exports: $Exports<'prettier-eslint/dist/utils'>;
39 | }
40 |
--------------------------------------------------------------------------------
/flow-typed/npm/eslint-import-resolver-babel-plugin-root-import_vx.x.x.js:
--------------------------------------------------------------------------------
1 | // flow-typed signature: 3512ef1e89d0b84ddb2a2c277f1e6ca6
2 | // flow-typed version: <>/eslint-import-resolver-babel-plugin-root-import_v^1.1.1/flow_v0.92.1
3 |
4 | /**
5 | * This is an autogenerated libdef stub for:
6 | *
7 | * 'eslint-import-resolver-babel-plugin-root-import'
8 | *
9 | * Fill this stub out by replacing all the `any` types.
10 | *
11 | * Once filled out, we encourage you to share your work with the
12 | * community by sending a pull request to:
13 | * https://github.com/flowtype/flow-typed
14 | */
15 |
16 | declare module 'eslint-import-resolver-babel-plugin-root-import' {
17 | declare module.exports: any;
18 | }
19 |
20 | /**
21 | * We include stubs for each file inside this npm package in case you need to
22 | * require those files directly. Feel free to delete any files that aren't
23 | * needed.
24 | */
25 | declare module 'eslint-import-resolver-babel-plugin-root-import/src/index' {
26 | declare module.exports: any;
27 | }
28 |
29 | // Filename aliases
30 | declare module 'eslint-import-resolver-babel-plugin-root-import/src/index.js' {
31 | declare module.exports: $Exports<
32 | 'eslint-import-resolver-babel-plugin-root-import/src/index',
33 | >;
34 | }
35 |
--------------------------------------------------------------------------------
/ios/mindCast/AppDelegate.m:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) Facebook, Inc. and its affiliates.
3 | *
4 | * This source code is licensed under the MIT license found in the
5 | * LICENSE file in the root directory of this source tree.
6 | */
7 |
8 | #import "AppDelegate.h"
9 |
10 | #import
11 | #import
12 |
13 | @implementation AppDelegate
14 |
15 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
16 | {
17 | NSURL *jsCodeLocation;
18 |
19 | jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
20 |
21 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
22 | moduleName:@"mindCast"
23 | initialProperties:nil
24 | launchOptions:launchOptions];
25 | rootView.backgroundColor = [UIColor blackColor];
26 |
27 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
28 | UIViewController *rootViewController = [UIViewController new];
29 | rootViewController.view = rootView;
30 | self.window.rootViewController = rootViewController;
31 | [self.window makeKeyAndVisible];
32 | return YES;
33 | }
34 |
35 | @end
36 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "parser": "babel-eslint",
3 | "env": {
4 | "jest": true
5 | },
6 | "plugins": ["react-native", "jsx-a11y", "import"],
7 | "extends": ["airbnb", "plugin:react-native/all"],
8 | "rules": {
9 | "no-plusplus": 0,
10 | "max-len": 0,
11 | "lines-between-class-members": 0,
12 | "no-underscore-dangle": 0,
13 | "import/no-cycle": 0,
14 | "no-alert": 0,
15 | "react-native/split-platform-components": 0,
16 | "import/no-extraneous-dependencies": 0,
17 | "import/no-dynamic-require": 0,
18 | "react/jsx-max-props-per-line": [1, { "maximum": 1, "when": "always" }],
19 | "react/jsx-first-prop-new-line": [1, "always"],
20 | "react-native/no-inline-styles": 0,
21 | "react/jsx-wrap-multilines": 0,
22 | "react-native/no-raw-text": 0,
23 | "consistent-return": 0,
24 | "react/jsx-filename-extension": [
25 | "error",
26 | {
27 | "extensions": [".js", ".jsx"]
28 | }
29 | ],
30 | "global-require": "off",
31 | "no-console": "off",
32 | "import/prefer-default-export": "off",
33 | "no-unused-vars": [
34 | "error",
35 | {
36 | "argsIgnorePattern": "^_"
37 | }
38 | ]
39 | },
40 | "settings": {
41 | "import/resolver": {
42 | "babel-plugin-root-import": {}
43 | }
44 | },
45 | "globals": {
46 | "__DEV__": true
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/src/store/ducks/subject.js:
--------------------------------------------------------------------------------
1 | export const Types = {
2 | GET_SUBJECT_DETAIL_REQUEST: 'subject/GET_SUBJECT_DETAIL_REQUEST',
3 | GET_SUBJECT_DETAIL_SUCCESS: 'subject/GET_SUBJECT_DETAIL_SUCCESS',
4 | GET_SUBJECT_DETAIL_ERROR: 'subject/GET_SUBJECT_DETAIL_ERROR',
5 | };
6 |
7 | const INITIAL_STATE = {
8 | loading: true,
9 | error: false,
10 | data: null,
11 | };
12 |
13 | export const Creators = {
14 | getSubjectDetail: id => ({
15 | type: Types.GET_SUBJECT_DETAIL_REQUEST,
16 | payload: { id },
17 | }),
18 |
19 | getSubjectDetailSuccess: data => ({
20 | type: Types.GET_SUBJECT_DETAIL_SUCCESS,
21 | payload: { data },
22 | }),
23 |
24 | getSubjectDetailFailure: () => ({
25 | type: Types.GET_SUBJECT_DETAIL_ERROR,
26 | }),
27 | };
28 |
29 | const subject = (state = INITIAL_STATE, { type, payload }) => {
30 | switch (type) {
31 | case Types.GET_SUBJECT_DETAIL_REQUEST:
32 | return {
33 | ...INITIAL_STATE,
34 | };
35 |
36 | case Types.GET_SUBJECT_DETAIL_SUCCESS:
37 | return {
38 | ...state,
39 | data: payload.data,
40 | loading: false,
41 | };
42 |
43 | case Types.GET_SUBJECT_DETAIL_ERROR:
44 | return {
45 | ...state,
46 | loading: false,
47 | error: true,
48 | };
49 |
50 | default:
51 | return state;
52 | }
53 | };
54 |
55 | export default subject;
56 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name = 'mindCast'
2 | include ':react-native-splash-screen'
3 | project(':react-native-splash-screen').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-splash-screen/android')
4 | include ':react-native-linear-gradient'
5 | project(':react-native-linear-gradient').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-linear-gradient/android')
6 | include ':react-native-gesture-handler'
7 | project(':react-native-gesture-handler').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-gesture-handler/android')
8 | include ':react-native-vector-icons'
9 | project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android')
10 | include ':react-native-fs'
11 | project(':react-native-fs').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fs/android')
12 | include ':react-native-video'
13 | project(':react-native-video').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-video/android')
14 |
15 | include ':app'
16 |
17 | include ':react-native-fs'
18 | project(':react-native-fs').projectDir = new File(settingsDir, '../node_modules/react-native-fs/android')
19 |
20 | include ':react-native-fast-image'
21 | project(':react-native-fast-image').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fast-image/android')
22 |
--------------------------------------------------------------------------------
/src/components/common/HeaderButton.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { Platform, TouchableOpacity } from 'react-native';
5 |
6 | import Icon from '~/components/common/Icon';
7 | import appStyles from '~/styles';
8 |
9 | type Props = {
10 | onPress: Function,
11 | iconName: string,
12 | position: string,
13 | };
14 |
15 | export const POSITIONS = {
16 | RIGHT: 'RIGHT',
17 | LEFT: 'LEFT',
18 | };
19 |
20 | export const HeaderButton = ({
21 | onPress,
22 | position,
23 | iconName,
24 | }: Props): Object => {
25 | const isRightPositioned = position === POSITIONS.RIGHT;
26 | const isLeftPositioned = position === POSITIONS.LEFT;
27 | const marginValue = Platform.OS === 'android' ? 16 : 14;
28 |
29 | const marginRight = isRightPositioned ? marginValue : 0;
30 | const marginLeft = isLeftPositioned ? marginValue : 0;
31 |
32 | return (
33 |
47 |
52 |
53 | );
54 | };
55 |
--------------------------------------------------------------------------------
/src/components/common/navigation/components/navigation-bar/NavigationBar.js:
--------------------------------------------------------------------------------
1 | // @flow
2 |
3 | import React from 'react';
4 | import { View } from 'react-native';
5 | import styled from 'styled-components';
6 |
7 | import isEqualsOrLargestThanIphoneX from '~/utils/isEqualsOrLargestThanIphoneX';
8 | import NavigationBarItem from './NavigationBarItem';
9 |
10 | const Wrapper = styled(View).attrs(({ theme }) => ({
11 | borderTopColor: theme.colors.secondaryColor,
12 | borderTopRightRadius: 1,
13 | borderTopWidth: 1,
14 | }))`
15 | width: 100%;
16 | height: ${({ theme }) => theme.metrics.getWidthFromDP('18%')
17 | + (isEqualsOrLargestThanIphoneX() ? 30 : 0)}px;
18 | flex-direction: row;
19 | align-items: center;
20 | justify-content: space-evenly;
21 | padding-bottom: ${isEqualsOrLargestThanIphoneX() ? 30 : 0}px;
22 | background-color: ${({ theme }) => theme.colors.backgroundColor};
23 | `;
24 |
25 | type Props = {
26 | onSelectStackRoute: Function,
27 | stackRouteSelected: number,
28 | items: Array