├── .babelrc ├── .buckconfig ├── .editorconfig ├── .flowconfig ├── .gitattributes ├── .gitignore ├── .watchmanconfig ├── App ├── Components │ ├── AboutText │ │ ├── AboutText.js │ │ ├── AboutText.story.js │ │ └── index.js │ ├── CardCommon.js │ ├── OrganizerCard │ │ ├── OrganizerCard.js │ │ ├── OrganizerCard.story.js │ │ └── index.js │ ├── OrganizersListing.js │ ├── OtherCard.js │ ├── PersonCommon.js │ ├── README.md │ ├── ReactFinlandLogo │ │ ├── ReactFinlandLogo.js │ │ ├── ReactFinlandLogo.story.js │ │ └── index.js │ ├── ScaleOnPress.js │ ├── SocialLink.js │ ├── SpeakerCard │ │ ├── SpeakerCard.js │ │ ├── SpeakerCard.story.js │ │ └── index.js │ ├── SpeakerListing.js │ ├── SponsorList │ │ ├── SponsorList.js │ │ ├── SponsorList.story.js │ │ └── index.js │ ├── Stories.js │ ├── Styles │ │ └── README.md │ ├── TalkCard.js │ ├── TalkCard.story.js │ ├── TalkDetail │ │ ├── SpeakerList.js │ │ ├── TalkDetail.js │ │ ├── TalkDetail.story.js │ │ └── index.js │ ├── TalkListing.js │ └── TalkListing.story.js ├── Config │ ├── AppConfig.js │ ├── DebugConfig.js │ ├── README.md │ ├── ReactotronConfig.js │ ├── ReduxPersist.js │ └── index.js ├── Containers │ ├── AboutScreen.js │ ├── App.js │ ├── FeedbackScreen.js │ ├── LaunchScreen.js │ ├── OrganizersScreen.js │ ├── README.md │ ├── RootContainer.js │ ├── SpeakersScreen.js │ ├── SponsorListScreen.js │ ├── Styles │ │ ├── FeedbackScreenStyle.js │ │ ├── LaunchScreenStyles.js │ │ ├── README.md │ │ └── RootContainerStyles.js │ ├── TalkDetailsScreen.js │ └── TalkScreen.js ├── Images │ ├── Icons │ │ ├── back-button@2x.png │ │ ├── chevron-right@2x.png │ │ ├── close-button.png │ │ ├── close-button@2x.png │ │ ├── close-button@3x.png │ │ ├── faq-icon.png │ │ ├── faq-icon@2x.png │ │ ├── faq-icon@3x.png │ │ ├── hamburger@2x.png │ │ ├── icon-api-testing@2x.png │ │ ├── icon-components@2x.png │ │ ├── icon-device-information@2x.png │ │ ├── icon-home@2x.png │ │ ├── icon-theme@2x.png │ │ └── icon-usage-examples@2x.png │ ├── README.md │ ├── alma.png │ ├── brigitte-tohm-64489-unsplash.jpg │ ├── dark-screen.jpeg │ ├── elisa.png │ ├── geniem.png │ ├── gofore.png │ ├── graphql-background.png │ ├── graphql_logo.png │ ├── hermes-rivera-258743-unsplash.jpg │ ├── motley.png │ ├── nitor.png │ ├── react-finland-background.png │ ├── reactfinland.png │ ├── rf-logo-white-with-text.png │ ├── rohea.png │ ├── solita.png │ └── verkkokauppa.png ├── Navigation │ ├── BuyTicketsLink.js │ ├── MenuButton.js │ ├── PrimaryNavigation.js │ ├── ReduxPrimaryNavigation.js │ ├── ScheduleNavigation.js │ ├── SideMenu.js │ └── styles.js ├── Redux │ ├── CreateStore.js │ ├── OrganizersRedux.js │ ├── PrimaryNavigationRedux.js │ ├── ScheduleRedux.js │ ├── ScreenTrackingMiddleware.js │ ├── SpeakersRedux.js │ ├── SponsorsRedux.js │ ├── StartupRedux.js │ └── index.js ├── Sagas │ ├── OrganizersSagas.js │ ├── SchedulesSagas.js │ ├── SpeakersSagas.js │ ├── SponsorsSagas.js │ ├── StartupSagas.js │ ├── fragmentTypes.json │ └── index.js ├── Services │ ├── ImmutablePersistenceTransform.js │ └── RehydrationServices.js └── Themes │ ├── ApplicationStyles.js │ ├── Colors.js │ ├── Fonts.js │ ├── Images.js │ ├── Metrics.js │ ├── README.md │ └── index.js ├── LICENSE ├── README.md ├── Tests ├── Setup.js └── StoriesTest.js ├── android ├── app │ ├── BUCK │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ └── fonts │ │ │ ├── AntDesign.ttf │ │ │ ├── Entypo.ttf │ │ │ ├── EvilIcons.ttf │ │ │ ├── Feather.ttf │ │ │ ├── Finlandica-Bold.otf │ │ │ ├── Finlandica-Regular.otf │ │ │ ├── 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 │ │ ├── java │ │ └── com │ │ │ └── reactfinlandapp │ │ │ ├── MainActivity.java │ │ │ └── MainApplication.java │ │ └── res │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── keystores │ ├── BUCK │ └── debug.keystore.properties └── settings.gradle ├── app.json ├── assets └── fonts │ ├── Finlandica-Bold.otf │ └── Finlandica-Regular.otf ├── ignite ├── ignite.json └── plugins │ └── .gitkeep ├── index.android.js ├── index.ios.js ├── index.js ├── ios ├── ReactFinlandApp-tvOS │ └── Info.plist ├── ReactFinlandApp-tvOSTests │ └── Info.plist ├── ReactFinlandApp.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ ├── ReactFinlandApp-tvOS.xcscheme │ │ └── ReactFinlandApp.xcscheme ├── ReactFinlandApp │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ │ └── LaunchScreen.xib │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── 1024.png │ │ │ ├── 120-1.png │ │ │ ├── 120.png │ │ │ ├── 180.png │ │ │ ├── 40.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ └── Contents.json │ │ └── Contents.json │ ├── Info.plist │ └── main.m └── ReactFinlandAppTests │ ├── Info.plist │ └── ReactFinlandAppTests.m ├── launch-assets ├── android │ ├── drawable-hdpi │ │ ├── icon.png │ │ └── screen.png │ ├── drawable-land-hdpi │ │ └── screen.png │ ├── drawable-land-ldpi │ │ └── screen.png │ ├── drawable-land-mdpi │ │ └── screen.png │ ├── drawable-land-xhdpi │ │ └── screen.png │ ├── drawable-land-xxhdpi │ │ └── screen.png │ ├── drawable-land-xxxhdpi │ │ └── screen.png │ ├── drawable-land │ │ └── screen.png │ ├── drawable-ldpi │ │ ├── icon.png │ │ └── screen.png │ ├── drawable-mdpi │ │ ├── icon.png │ │ └── screen.png │ ├── drawable-xhdpi │ │ ├── icon.png │ │ └── screen.png │ ├── drawable-xxhdpi │ │ ├── icon.png │ │ └── screen.png │ ├── drawable-xxxhdpi │ │ ├── icon.png │ │ └── screen.png │ └── drawable │ │ ├── icon.png │ │ └── screen.png └── iOS │ └── AppIcon.appiconset │ ├── Contents.json │ ├── Icon-20x20@2x.png │ ├── Icon-20x20@3x.png │ ├── Icon-29x29@1x.png │ ├── Icon-29x29@2x.png │ ├── Icon-40x40@2x.png │ ├── Icon-40x40@3x.png │ ├── Icon-60x60@2x.png │ ├── Icon-60x60@3x.png │ └── Icon-marketing-1024x1024.png ├── package-lock.json ├── package.json ├── rn-cli.config.js ├── storybook ├── addons.js ├── index.android.js ├── index.ios.js └── storybook.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["module:metro-react-native-babel-preset"] 3 | } 4 | -------------------------------------------------------------------------------- /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | indent_style = space 11 | indent_size = 2 12 | charset = utf-8 13 | trim_trailing_whitespace = true 14 | 15 | 16 | [*.gradle] 17 | indent_size = 4 -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore unexpected extra "@providesModule" 9 | .*/node_modules/.*/node_modules/fbjs/.* 10 | 11 | ; Ignore duplicate module providers 12 | ; For RN Apps installed via npm, "Libraries" folder is inside 13 | ; "node_modules/react-native" but in the source repo it is in the root 14 | .*/Libraries/react-native/React.js 15 | .*/Libraries/react-native/ReactNative.js 16 | 17 | [include] 18 | 19 | [libs] 20 | node_modules/react-native/Libraries/react-native/react-native-interface.js 21 | node_modules/react-native/flow 22 | flow/ 23 | 24 | [options] 25 | emoji=true 26 | 27 | module.system=haste 28 | 29 | munge_underscores=true 30 | 31 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' 32 | 33 | suppress_type=$FlowIssue 34 | suppress_type=$FlowFixMe 35 | suppress_type=$FixMe 36 | 37 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-9]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 38 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-9]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 39 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 40 | suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError 41 | 42 | unsafe.enable_getters_and_setters=true 43 | 44 | [version] 45 | ^0.49.1 46 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | *.bat text eol=crlf -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | tsconfig.json 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 | # fastlane 45 | # 46 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 47 | # screenshots whenever they are needed. 48 | # For more information about the recommended setup visit: 49 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 50 | 51 | ios/fastlane/report.xml 52 | ios/fastlane/Preview.html 53 | ios/fastlane/screenshots 54 | 55 | # VSCode 56 | .vscode/ 57 | jsconfig.json 58 | 59 | # More VScode (autogenerated) 60 | .classpath 61 | .settings 62 | .project 63 | 64 | *.zip 65 | 66 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /App/Components/AboutText/AboutText.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { View } from 'react-native' 3 | import styled from 'styled-components/native' 4 | import { Fonts, Colors } from '../../Themes' 5 | 6 | const TextArea = styled.Text` 7 | color: ${Colors.ricePaper}; 8 | padding-left: 30; 9 | padding-right: 30; 10 | padding-top: 20; 11 | font-size: ${Fonts.size.regular}; 12 | font-family: ${Fonts.type.base}; 13 | background-color: 'rgba(0,0,0,0)'; 14 | ` 15 | 16 | const Headline = styled.Text` 17 | color: ${Colors.snow}; 18 | padding-left: 30; 19 | padding-right: 30; 20 | padding-top: 20; 21 | font-size: ${Fonts.size.h1}; 22 | font-family: ${Fonts.type.base}; 23 | background-color: 'rgba(0,0,0,0)'; 24 | ` 25 | 26 | const FinlandText = styled.Text` 27 | color: ${Colors.reactFinlandBlue} 28 | ` 29 | 30 | class AboutText extends React.Component { 31 | render () { 32 | return ( 33 | 34 | 35 | REACTFINLAND 36 | 37 | 40 | 43 | 46 | 47 | ) 48 | } 49 | } 50 | 51 | export default AboutText 52 | -------------------------------------------------------------------------------- /App/Components/AboutText/AboutText.story.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { storiesOf } from '@storybook/react-native' 3 | 4 | import AboutText from './AboutText' 5 | class DefaultStory extends React.Component { 6 | render () { 7 | return ( 8 | 9 | ) 10 | } 11 | } 12 | storiesOf('AboutText') 13 | .add('Default', () => ) 14 | -------------------------------------------------------------------------------- /App/Components/AboutText/index.js: -------------------------------------------------------------------------------- 1 | import AboutText from './AboutText' 2 | import Story from './AboutText.story' 3 | export { 4 | Story 5 | } 6 | export default AboutText 7 | -------------------------------------------------------------------------------- /App/Components/CardCommon.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import { Fonts, Colors } from '../Themes' 3 | 4 | export const Container = styled.View` 5 | background-color: ${props => props.nonopenable ? Colors.transparent : Colors.snow}; 6 | padding: 20px; 7 | border-bottom-color: ${Colors.grey}; 8 | border-bottom-width: ${props => props.nonopenable ? '0px' : '1px'};; 9 | ` 10 | export const AlignRight = styled.View` 11 | flex-direction: row; 12 | justify-content: flex-end; 13 | ` 14 | 15 | export const Speaker = styled.Text` 16 | color: ${Colors.charcoal}; 17 | font-size: ${Fonts.size.medium}; 18 | font-family: ${Fonts.type.base}; 19 | padding-top: 5px; 20 | ` 21 | 22 | export const Row = styled.View` 23 | flex-direction: row; 24 | ` 25 | 26 | export const Title = styled.Text` 27 | color: black; 28 | font-size: ${Fonts.size.regular}; 29 | font-family: ${Fonts.type.base}; 30 | ` 31 | export const Description = styled.Text` 32 | color: black; 33 | font-size: ${Fonts.size.medium}; 34 | font-family: ${Fonts.type.base}; 35 | ` 36 | 37 | export const TalkInfo = styled.View` 38 | flex: 1; 39 | ` 40 | 41 | // margin-left: make sure we don't overlap w/ the TalkInfo text 42 | export const ImageContainer = styled.View` 43 | flex-direction: row; 44 | justify-content: flex-end; 45 | margin-left: 15px; 46 | ` 47 | 48 | export const TimeInfo = styled.View` 49 | background-color: ${props => props.nonopenable ? Colors.transparent : Colors.snow}; 50 | flex-direction: row; 51 | align-items: center; 52 | ` 53 | 54 | export const RoundedImage = styled.Image` 55 | width: 100; 56 | height: 100; 57 | border-radius: 50px; 58 | margin-left: -15px; 59 | ` 60 | 61 | export const Time = styled.Text` 62 | color: ${Colors.charcoal}; 63 | font-size: ${Fonts.size.regular}; 64 | font-family: ${Fonts.type.base}; 65 | margin-left: 5px; 66 | ` 67 | -------------------------------------------------------------------------------- /App/Components/OrganizerCard/OrganizerCard.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import SocialLink from '../SocialLink' 3 | import { Container, Row, SpeakerInfo, Author, About, ImageContainer, RoundedImage, Social } from '../PersonCommon' 4 | 5 | const OrganizerCard = (props) => { 6 | const { author, picture, about, homepage, twitter, github, linkedin } = props 7 | return ( 8 | 9 | 10 | 11 | { author } 12 | { about } 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | ) 26 | } 27 | 28 | export default OrganizerCard 29 | -------------------------------------------------------------------------------- /App/Components/OrganizerCard/OrganizerCard.story.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { View } from 'react-native' 3 | import { storiesOf } from '@storybook/react-native' 4 | 5 | import OrganizerCard from './OrganizerCard' 6 | 7 | class DefaultStory extends React.Component { 8 | render () { 9 | return ( 10 | 11 | 16 | 17 | ) 18 | } 19 | } 20 | storiesOf('SpeakerCard') 21 | .add('Default', () => ) 22 | -------------------------------------------------------------------------------- /App/Components/OrganizerCard/index.js: -------------------------------------------------------------------------------- 1 | import OrganizerCard from './OrganizerCard' 2 | import Story from './OrganizerCard.story' 3 | export { 4 | Story 5 | } 6 | export default OrganizerCard 7 | -------------------------------------------------------------------------------- /App/Components/OrganizersListing.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styled from 'styled-components/native' 3 | import gql from 'graphql-tag'; 4 | import { Query } from 'react-apollo'; 5 | import OrganizerCard from './OrganizerCard' 6 | import { ActivityIndicator, View } from 'react-native' 7 | 8 | const FlatList = styled.FlatList` 9 | background-color: transparent; 10 | ` 11 | const getOrganizers = gql` 12 | { 13 | conference(id: "react-finland-2019") { 14 | organizers { 15 | name 16 | about 17 | image { 18 | url 19 | } 20 | social { 21 | twitter 22 | homepage 23 | github 24 | linkedin 25 | } 26 | } 27 | } 28 | } 29 | ` 30 | export default class OrganizersListing extends React.Component { 31 | renderOrganizerCard ({ item }) { 32 | const { name, image, about, social: { homepage, twitter, github, linkedin } } = item 33 | return 42 | } 43 | 44 | render () { 45 | return ( 46 | 47 | {({ loading, error, data }) => { 48 | // TODO show loading and error component 49 | if (loading) return ; 50 | if (error) return ; 51 | const {conference: { organizers }} = data 52 | return ( 53 | item.name} 55 | data={organizers} 56 | renderItem={this.renderOrganizerCard} 57 | /> 58 | )}} 59 | 60 | ) 61 | } 62 | } 63 | 64 | -------------------------------------------------------------------------------- /App/Components/OtherCard.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { TouchableWithoutFeedback, View } from 'react-native' 3 | import Icon from 'react-native-vector-icons/FontAwesome' 4 | import * as Animatable from 'react-native-animatable' 5 | import styled from 'styled-components/native' 6 | import R from 'ramda' 7 | 8 | import {Container, AlignRight, Speaker, Row, Title, TalkInfo, ImageContainer, TimeInfo, RoundedImage, Time} from './CardCommon' 9 | 10 | import { Metrics, Colors } from '../Themes' 11 | import { scaleOnPress } from './ScaleOnPress' 12 | 13 | class OtherCard extends React.Component { 14 | 15 | render () { 16 | const { onPress, onPressIn, onPressOut } = this.props 17 | const { session, begin, end } = this.props 18 | 19 | return ( 20 | 21 | 22 | 23 | { session.title || 'To be announced' } 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | ) 33 | } 34 | } 35 | 36 | export default OtherCard 37 | -------------------------------------------------------------------------------- /App/Components/PersonCommon.js: -------------------------------------------------------------------------------- 1 | import { Fonts, Colors } from '../Themes' 2 | import styled from 'styled-components/native' 3 | 4 | export const Container = styled.View` 5 | background-color: ${Colors.snow}; 6 | border-bottom-color: ${Colors.grey}; 7 | border-bottom-width: 1px; 8 | padding-bottom: 5px; 9 | ` 10 | 11 | export const Row = styled.View` 12 | flex-direction: row; 13 | ` 14 | 15 | export const Author = styled.Text` 16 | color: black; 17 | font-size: ${Fonts.size.regular}; 18 | font-family: ${Fonts.type.base}; 19 | ` 20 | 21 | export const About = styled.Text` 22 | color: ${Colors.charcoal}; 23 | font-size: ${Fonts.size.medium}; 24 | font-family: ${Fonts.type.base}; 25 | padding-top: 5px; 26 | ` 27 | 28 | export const SpeakerInfo = styled.View` 29 | flex: 7; 30 | justify-content: center; 31 | padding: 15px; 32 | ` 33 | 34 | export const ImageContainer = styled.View` 35 | flex: 1; 36 | align-items: center; 37 | padding-right: 15; 38 | padding-bottom: 10; 39 | padding-top: 10; 40 | ` 41 | 42 | export const RoundedImage = styled.Image` 43 | width: 50; 44 | height: 50; 45 | border-radius: 25px; 46 | border-width: 1px; 47 | border-color: ${Colors.grey} 48 | ` 49 | 50 | export const Social = styled.View` 51 | flex-direction: row; 52 | justify-content: flex-end; 53 | align-items: center; 54 | ` 55 | -------------------------------------------------------------------------------- /App/Components/README.md: -------------------------------------------------------------------------------- 1 | ### Components Folder 2 | All components are stored and organized here 3 | -------------------------------------------------------------------------------- /App/Components/ReactFinlandLogo/ReactFinlandLogo.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import { Image } from 'react-native' 4 | 5 | const ReactFinlandLogo = (props) => { 6 | return 7 | } 8 | 9 | ReactFinlandLogo.propTypes = { 10 | width: PropTypes.number.isRequired, 11 | height: PropTypes.number.isRequired 12 | } 13 | 14 | export default ReactFinlandLogo 15 | -------------------------------------------------------------------------------- /App/Components/ReactFinlandLogo/ReactFinlandLogo.story.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { storiesOf } from '@storybook/react-native' 3 | 4 | import ReactFinlandLogo from './ReactFinlandLogo' 5 | 6 | class DefaultStory extends React.Component { 7 | render () { 8 | return ( 9 | 10 | ) 11 | } 12 | } 13 | storiesOf('ReactFinlandLogo') 14 | .add('Default', () => ) 15 | storiesOf('ReactFinlandLogo') 16 | .add('Default', () => ( 17 | 18 | )) 19 | -------------------------------------------------------------------------------- /App/Components/ReactFinlandLogo/index.js: -------------------------------------------------------------------------------- 1 | import ReactFinlandLogo from './ReactFinlandLogo' 2 | import Story from './ReactFinlandLogo.story' 3 | export { 4 | Story 5 | } 6 | export default ReactFinlandLogo 7 | -------------------------------------------------------------------------------- /App/Components/ScaleOnPress.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | export const scaleOnPress = () => { 4 | return WrappedComponent => { 5 | class ScaleOnPress extends React.Component { 6 | state = { 7 | opening: false 8 | } 9 | onPressIn = container => { 10 | container.transition({ scale: 1.0 }, { scale: 0.95 }, 300) 11 | } 12 | 13 | onPressOut = container => { 14 | container.transitionTo({ scale: 1.0 }, 300) 15 | } 16 | onPress = () => { 17 | const { opening } = this.state 18 | const { onPress } = this.props 19 | if (opening) { 20 | return 21 | } 22 | 23 | this.setState({opening: true}) 24 | setTimeout(() => onPress(), 200) 25 | setTimeout(() => this.setState({opening: false}), 600) 26 | } 27 | render () { 28 | return ( 29 | 35 | ) 36 | } 37 | } 38 | 39 | return ScaleOnPress 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /App/Components/SocialLink.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Linking } from 'react-native' 3 | import Icon from 'react-native-vector-icons/FontAwesome' 4 | import styled from 'styled-components/native' 5 | import R from 'ramda' 6 | import { Metrics, Colors } from '../Themes' 7 | 8 | // Add margin between elements, this should probably be handled in the parent 9 | // component 10 | const TouchableWithMargin = styled.TouchableOpacity` 11 | margin-left: 10px; 12 | margin-right: 10px; 13 | ` 14 | const getIcon = R.cond([ 15 | [R.contains('twitter'), R.always('twitter')], 16 | [R.contains('linkedin'), R.always('linkedin-square')], 17 | [R.contains('google.com/maps'), R.always('map-marker')], 18 | [R.contains('github.com'), R.always('github')], 19 | [R.T, R.always('home')] 20 | ]) 21 | 22 | class SocialLink extends React.Component { 23 | 24 | onPress = () => { 25 | const { link } = this.props 26 | if (!link) return 27 | Linking.canOpenURL(link).then(supported => { 28 | if (supported) { 29 | Linking.openURL(link).catch(err => { 30 | console.error(`Failed to open link ${link}`) 31 | console.error(err) 32 | }) 33 | } 34 | }) 35 | } 36 | 37 | render () { 38 | const { icon, link, children } = this.props 39 | 40 | if (!link) return null 41 | 42 | return ( 43 | 44 | 45 | { children } 46 | 47 | ) 48 | } 49 | } 50 | 51 | export default SocialLink 52 | -------------------------------------------------------------------------------- /App/Components/SpeakerCard/SpeakerCard.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import SocialLink from '../SocialLink' 3 | import * as Animatable from 'react-native-animatable' 4 | import { TouchableWithoutFeedback } from 'react-native' 5 | 6 | import { Container, Row, SpeakerInfo, Author, About, ImageContainer, RoundedImage, Social } from '../PersonCommon' 7 | 8 | const StyledContainer = Animatable.createAnimatableComponent(Container) 9 | 10 | class SpeakerCard extends React.Component { 11 | state = { 12 | expanded: false 13 | } 14 | onPressIn = () => { 15 | this.container.transition({ scale: 1.0 }, { scale: 0.95 }, 300) 16 | } 17 | 18 | onPressOut = () => { 19 | this.container.transitionTo({ scale: 1.0 }, 300) 20 | } 21 | render () { 22 | const { author, picture, about, homepage, twitter, github, linkedin } = this.props 23 | const { expanded } = this.state 24 | return ( 25 | this.setState({expanded: !this.state.expanded})} onPressIn={this.onPressIn} onPressOut={this.onPressOut}> 26 | { this.container = ref }}> 27 | 28 | 29 | { author } 30 | { expanded 31 | ? { about } 32 | : { about } 33 | 34 | } 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | ) 50 | } 51 | } 52 | 53 | export default SpeakerCard 54 | -------------------------------------------------------------------------------- /App/Components/SpeakerCard/SpeakerCard.story.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { View } from 'react-native' 3 | import { storiesOf } from '@storybook/react-native' 4 | 5 | import SpeakerCard from './SpeakerCard' 6 | 7 | class DefaultStory extends React.Component { 8 | render () { 9 | return ( 10 | 11 | 16 | 17 | ) 18 | } 19 | } 20 | storiesOf('SpeakerCard') 21 | .add('SpeakerCard 2', () => ) 22 | -------------------------------------------------------------------------------- /App/Components/SpeakerCard/index.js: -------------------------------------------------------------------------------- 1 | import SpeakerCard from './SpeakerCard' 2 | import Story from './SpeakerCard.story' 3 | export { 4 | Story 5 | } 6 | export default SpeakerCard 7 | -------------------------------------------------------------------------------- /App/Components/SpeakerListing.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styled from 'styled-components/native' 3 | import gql from 'graphql-tag'; 4 | import { Query } from 'react-apollo'; 5 | import SpeakerCard from './SpeakerCard' 6 | import { Colors } from '../Themes' 7 | import { ActivityIndicator, View } from 'react-native' 8 | 9 | const FlatList = styled.FlatList` 10 | background-color: ${Colors.background} 11 | ` 12 | const getSpeakers = gql` 13 | { 14 | conference(id: "react-finland-2019") { 15 | speakers { 16 | name 17 | about 18 | image { 19 | url 20 | } 21 | social { 22 | twitter 23 | github 24 | homepage 25 | medium 26 | } 27 | } 28 | } 29 | }` 30 | 31 | export default class SpeakerListing extends React.Component { 32 | renderSpeakerCard ({ item }) { 33 | const { name, image, about, social: { homepage, twitter, github, linkedin } } = item 34 | return 43 | } 44 | 45 | render () { 46 | return ( 47 | 48 | {({ loading, error, data }) => { 49 | // TODO show loading and error component 50 | if (loading) return ; 51 | if (error) return ; 52 | const {conference: { speakers }} = data 53 | return ( 54 | item.name} 56 | data={speakers} 57 | renderItem={this.renderSpeakerCard} 58 | /> 59 | )}} 60 | 61 | ) 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /App/Components/SponsorList/SponsorList.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { View, WebView, ScrollView, Dimensions } from 'react-native' 3 | import styled from 'styled-components/native' 4 | import { Fonts } from '../../Themes' 5 | import { connect } from 'react-redux' 6 | import { pathOr } from 'ramda' 7 | 8 | export const GoldImage = styled.Image` 9 | height: 100px; 10 | width: 140; 11 | ` 12 | 13 | export const BronzeWrapper = styled.View` 14 | padding-left: 10px; 15 | padding-right: 10px; 16 | background-color: black; 17 | ` 18 | 19 | export const BackgroundImage = styled.ImageBackground` 20 | flex: 1; 21 | justify-content: space-between; 22 | ` 23 | export const SponsorContainer = styled.View` 24 | flex: 1; 25 | padding-top: 20px; 26 | padding-bottom: 20px; 27 | padding-left: 10px; 28 | padding-right: 10px; 29 | ` 30 | 31 | export const Text = styled.Text` 32 | color: ${props => props.textcolor}; 33 | padding-top: 20; 34 | padding-left: 20; 35 | padding-bottom: 15px; 36 | padding-right: 30; 37 | text-align: center; 38 | font-size: ${Fonts.size.h3}; 39 | font-family: ${Fonts.type.base}; 40 | ` 41 | const firstHtml = '' 42 | const lastHtml = '' 43 | 44 | class SponsorList extends React.Component { 45 | render () { 46 | const {height, width} = Dimensions.get('window'); 47 | return ( 48 | 49 | 50 | 51 | 52 | 53 | Gold 54 | { this.props.gold.map((i, index) => ( 55 | i.image.url.endsWith('svg') 56 | ? ${lastHtml}` }} /> 61 | : 62 | ) 63 | )} 64 | 65 | 66 | 67 | Silver 68 | { this.props.silver.map((i, index) => ( 69 | i.image.url.endsWith('svg') 70 | ? ${lastHtml}` }} /> 75 | : 76 | ) 77 | )} 78 | 79 | 80 | 81 | Bronze 82 | { this.props.bronze.map((i, index) => ( 83 | i.image.url.endsWith('svg') 84 | ? ${lastHtml}` }} /> 89 | : 90 | ) 91 | )} 92 | 93 | 94 | 95 | 96 | 97 | ) 98 | } 99 | } 100 | const mapStateToProps = ({sponsors}) => ({ 101 | gold: pathOr([], ['data', 'goldSponsors'], sponsors), 102 | silver: pathOr([], ['data', 'silverSponsors'], sponsors), 103 | bronze: pathOr([], ['data', 'bronzeSponsors'], sponsors) 104 | }) 105 | export default connect(mapStateToProps)(SponsorList) -------------------------------------------------------------------------------- /App/Components/SponsorList/SponsorList.story.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { storiesOf } from '@storybook/react-native' 3 | 4 | import SponsorList from './SponsorList' 5 | class DefaultStory extends React.Component { 6 | render () { 7 | return ( 8 | 9 | ) 10 | } 11 | } 12 | storiesOf('SponsorList') 13 | .add('Default', () => ) 14 | -------------------------------------------------------------------------------- /App/Components/SponsorList/index.js: -------------------------------------------------------------------------------- 1 | import SponsorList from './SponsorList' 2 | import Story from './SponsorList.story' 3 | export { 4 | Story 5 | } 6 | export default SponsorList 7 | -------------------------------------------------------------------------------- /App/Components/Stories.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | require('./AboutText').Story 3 | require('./TalkCard.story') 4 | require('./SpeakerCard').Story 5 | require('./SponsorList').Story 6 | require('./ReactFinlandLogo').Story 7 | require('./WorkshopTile').Story 8 | require('./TalkDetail').Story 9 | require('./TalkListing.story') 10 | -------------------------------------------------------------------------------- /App/Components/Styles/README.md: -------------------------------------------------------------------------------- 1 | ### Styles Folder 2 | Component styles are separated from functionality. 3 | -------------------------------------------------------------------------------- /App/Components/TalkCard.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { TouchableWithoutFeedback, View } from 'react-native' 3 | import Icon from 'react-native-vector-icons/FontAwesome' 4 | import * as Animatable from 'react-native-animatable' 5 | import styled from 'styled-components/native' 6 | import R from 'ramda' 7 | 8 | import {Container, AlignRight, Speaker, Row, Title, TalkInfo, ImageContainer, TimeInfo, RoundedImage, Time} from './CardCommon' 9 | 10 | import { Metrics, Colors } from '../Themes' 11 | import { scaleOnPress } from './ScaleOnPress' 12 | 13 | const makeSpeakersText = (speakers) => 14 | speakers && speakers.length > 0 ? speakers.map(a => a.name).join('\n') : '' 15 | 16 | const getImage = (speakers) => ( 17 | speakers && speakers.length > 0 18 | ? speakers.map(speaker => ) 19 | : null 20 | ) 21 | 22 | const StyledContainer = Animatable.createAnimatableComponent(Container) 23 | 24 | class TalkCard extends React.Component { 25 | get icon () { 26 | const { session } = this.props 27 | const { type } = session 28 | 29 | const iconForType = R.cond([ 30 | [R.equals('lightningTalk'), R.always('star-o')], 31 | [R.equals('keynote'), R.always('lightbulb-o')], 32 | [R.T, R.always(null)] 33 | ]) 34 | 35 | const icon = iconForType(type) 36 | return icon 37 | ? 38 | : null 39 | } 40 | 41 | render () { 42 | const { onPress, onPressIn, onPressOut } = this.props 43 | const { session, begin, end } = this.props 44 | const { speakers = [], title = '', type } = session 45 | 46 | const image = getImage(speakers) 47 | return ( 48 | onPress()} onPressIn={() => onPressIn(this.container)} onPressOut={() => onPressOut(this.container)}> 49 | { this.container = ref }}> 50 | 51 | 52 | { title || 'To be announced' } 53 | { makeSpeakersText(speakers) } 54 | 55 | { image ? { image } : null } 56 | 57 | 58 | 59 | 60 | 61 | ) 62 | } 63 | } 64 | 65 | export default scaleOnPress()(TalkCard) 66 | -------------------------------------------------------------------------------- /App/Components/TalkCard.story.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { View } from 'react-native' 3 | import { storiesOf } from '@storybook/react-native' 4 | 5 | import TalkCard from './TalkCard' 6 | 7 | const data = { 8 | 'begin': '13:00', 9 | 'end': '14:00', 10 | 'speakers': [ 11 | { 12 | 'name': 'Christian Alfoni', 13 | 'about': 'Christian has been crunching JavaScript for about 8 years. In the recent years open source and writing articles has become a passion. Throwing bad and not so bad ideas out there to see what is valuable to people. Author of Cerebral, created Webpackbin and JSBlog... amongst other things.', 14 | 'image': 'christian.jpg', 15 | 'homepage': 'http://www.christianalfoni.com/', 16 | 'twitter': 'christianalfoni', 17 | 'github': 'christianalfoni' 18 | }, 19 | { 20 | 'name': 'Christian Alfoni', 21 | 'about': 'Christian has been crunching JavaScript for about 8 years. In the recent years open source and writing articles has become a passion. Throwing bad and not so bad ideas out there to see what is valuable to people. Author of Cerebral, created Webpackbin and JSBlog... amongst other things.', 22 | 'image': 'christian.jpg', 23 | 'homepage': 'http://www.christianalfoni.com/', 24 | 'twitter': 'christianalfoni', 25 | 'github': 'christianalfoni' 26 | } 27 | ], 28 | 'title': 'Declarative state and side effects', 29 | 'description': 'Writing declarative code for our UIs is so common that we do not even think about it. But when it comes to writing logic for managing state and side effects it requires a lot of discipline to get the same benefits. We are going to talk about how we can get help writing our business logic in a declarative manner and see what benefits it gives us.' 30 | } 31 | 32 | class DefaultStory extends React.Component { 33 | render () { 34 | return ( 35 | 36 | 42 | 43 | ) 44 | } 45 | } 46 | storiesOf('TalkCard') 47 | .add('Default', () => ) 48 | -------------------------------------------------------------------------------- /App/Components/TalkDetail/SpeakerList.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styled from 'styled-components/native' 3 | 4 | import { Colors, Fonts, Metrics } from '../../Themes' 5 | 6 | const Row = styled.View` 7 | flex: 1; 8 | flex-direction: row; 9 | ` 10 | 11 | const Name = styled.Text` 12 | padding-top: ${Metrics.smallMargin}px; 13 | color: ${Colors.snow}; 14 | font-family: ${Fonts.type.base}; 15 | font-size: ${Fonts.size.regular}; 16 | text-align: center; 17 | ` 18 | 19 | const Container = styled.View` 20 | flex: 1; 21 | align-items: center; 22 | background-color: rgba(0,0,0,0); 23 | ` 24 | 25 | const RoundedImage = styled.Image` 26 | width: 120; 27 | height: 120; 28 | border-radius: 60px; 29 | border-width: 1px; 30 | border-color: ${Colors.grey} 31 | ` 32 | 33 | const SpeakerItem = ({ speaker }) => ( 34 | 35 | 36 | {speaker.name} 37 | 38 | ) 39 | 40 | const SpeakerList = ({ speakers }) => ( 41 | 42 | {speakers.map(speaker => )} 43 | 44 | ) 45 | 46 | export default SpeakerList 47 | -------------------------------------------------------------------------------- /App/Components/TalkDetail/TalkDetail.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styled from 'styled-components/native' 3 | import { Button } from 'react-native' 4 | import SpeakerList from './SpeakerList' 5 | import { Colors, Fonts, Metrics } from '../../Themes' 6 | import SocialLink from '../SocialLink' 7 | 8 | const BackgroundImage = styled.ImageBackground` 9 | flex: 1; 10 | ` 11 | const Container = styled.ScrollView` 12 | flex: 1; 13 | background-color: ${Colors.snow}; 14 | padding: ${Metrics.baseMargin}px; 15 | background-color: rgba(0,0,0,0); 16 | border-radius: 10; 17 | ` 18 | 19 | const Top = styled.View` 20 | padding: ${Metrics.doubleBaseMargin}px; 21 | ` 22 | const Bottom = styled.View` 23 | margin: ${Metrics.doubleSection}px; 24 | ` 25 | const LocationWrapper = styled.View` 26 | padding-left:${Metrics.baseMargin}px; 27 | padding-bottom: ${Metrics.baseMargin}px; 28 | flex-direction: row; 29 | ` 30 | const LocationName = styled.Text` 31 | padding-left:${Metrics.baseMargin}px; 32 | color: ${Colors.text}; 33 | font-size: ${Fonts.size.regular}; 34 | font-family: ${Fonts.type.base}; 35 | text-decoration-line: underline; 36 | color: ${Colors.snow}; 37 | ` 38 | 39 | const Title = styled.Text` 40 | color: ${Colors.text}; 41 | font-size: ${Fonts.size.h3}; 42 | font-family: ${Fonts.type.bold}; 43 | text-align: center; 44 | background-color: rgba(0,0,0,0); 45 | ` 46 | 47 | const Description = styled.Text` 48 | color: ${Colors.text}; 49 | font-size: ${Fonts.size.regular}; 50 | font-family: ${Fonts.type.base}; 51 | color: ${Colors.snow}; 52 | padding-bottom: ${2 * Metrics.doubleBaseMargin}px; 53 | background-color: rgba(0,0,0,0); 54 | ` 55 | // supporting only google maps for now since character escaping was not working well on apple maps 56 | const getLocationLink = location => encodeURI(`https://www.google.com/maps/place/${location.address}`) 57 | 58 | class TalkDetail extends React.Component { 59 | render () { 60 | const { title, description, speakers, location, navigation } = this.props 61 | return ( 62 | 63 | 64 | 65 | {title} 66 | 67 | {location && 68 | 69 | 70 | 71 | {location && `${location.name}`} 72 | 73 | 74 | 75 | } 76 | {speakers && } 77 | 78 | {description} 79 | 70 | 71 | 72 | 73 | 74 | ) 75 | } 76 | 77 | const mapStateToProps = ({ schedule: { selectedSession } }) => { 78 | return { 79 | selectedSession 80 | } 81 | } 82 | 83 | const mapDispatchToProps = (dispatch) => { 84 | return { 85 | } 86 | } 87 | 88 | export default connect(mapStateToProps, mapDispatchToProps)(FeedbackScreen) 89 | -------------------------------------------------------------------------------- /App/Containers/LaunchScreen.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { ScrollView, Text, Image, View } from 'react-native' 3 | import { Images } from '../Themes' 4 | 5 | // Styles 6 | import styles from './Styles/LaunchScreenStyles' 7 | 8 | export default class LaunchScreen extends Component { 9 | render () { 10 | return ( 11 | 12 | 13 | 14 | 15 | 16 | REACT 17 | 18 | {` FINLAND `} 19 | 20 | 21 | 22 | 23 | 24 | 25 | One workshop day + two days of presentations 26 | 27 | 28 | 29 | 30 | Your chance to learn more about React up 31 | north 32 | 33 | 34 | 35 | 36 | 37 | ) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /App/Containers/OrganizersScreen.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { connect } from 'react-redux' 3 | 4 | import { Colors } from '../Themes' 5 | import OrganizersListing from '../Components/OrganizersListing' 6 | import styled from 'styled-components/native' 7 | 8 | const Screen = styled.View` 9 | background-color: ${Colors.reactFinlandBlue}; 10 | padding-bottom: 0; 11 | flex: 1; 12 | ` 13 | class OrganizersScreen extends Component { 14 | render () { 15 | let { data } = this.props 16 | return ( 17 | 18 | 19 | 20 | ) 21 | } 22 | } 23 | 24 | const mapStateToProps = ({ organizers: {data} }) => ({ 25 | data 26 | }) 27 | 28 | export default connect(mapStateToProps)(OrganizersScreen) 29 | -------------------------------------------------------------------------------- /App/Containers/README.md: -------------------------------------------------------------------------------- 1 | ### Containers Folder 2 | A container is what they call a "Smart Component" in Redux. It is a component 3 | which knows about Redux. They are usually used as "Screens". 4 | 5 | Also located in here are 2 special containers: `App.js` and `RootContainer.js`. 6 | 7 | `App.js` is first component loaded after `index.ios.js` or `index.android.js`. The purpose of this file is to setup Redux or any other non-visual "global" modules. Having Redux setup here helps with the hot-reloading process in React Native during development as it won't try to reload your sagas and reducers should your colors change (for example). 8 | 9 | `RootContainer.js` is the first visual component in the app. It is the ancestor of all other screens and components. 10 | 11 | You'll probably find you'll have great mileage in Ignite apps without even touching these 2 files. They, of course, belong to you, so when you're ready to add something non-visual like Firebase or something visual like an overlay, you have spots to place these additions. 12 | -------------------------------------------------------------------------------- /App/Containers/RootContainer.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { View, StatusBar, BackHandler, Platform } from 'react-native' 3 | import ReduxPrimaryNavigation from '../Navigation/ReduxPrimaryNavigation' 4 | import { connect } from 'react-redux' 5 | import StartupActions from '../Redux/StartupRedux' 6 | import ReduxPersist from '../Config/ReduxPersist' 7 | import { NavigationActions } from 'react-navigation' 8 | import { Colors } from '../Themes' 9 | import styles from './Styles/RootContainerStyles' 10 | 11 | // https://github.com/react-navigation/react-navigation/issues/1349#issuecomment-304692012 12 | const isRootScreen = (navigator) => { 13 | if (navigator.index == null) { 14 | return true 15 | } 16 | 17 | if (navigator.index > 0) { 18 | return false 19 | } 20 | 21 | return !navigator.routes || !navigator.routes.find(route => !isRootScreen(route)) 22 | } 23 | 24 | class RootContainer extends Component { 25 | componentWillMount () { 26 | BackHandler.addEventListener('hardwareBackPress', this.onBackButtonPressed) 27 | } 28 | 29 | componentWillUnmount () { 30 | BackHandler.removeEventListener('hardwareBackPress', this.onBackButtonPressed) 31 | } 32 | 33 | onBackButtonPressed = () => { 34 | if (isRootScreen(this.props.navigation)) { 35 | // let react-navigation pop the screen 36 | return false 37 | } 38 | 39 | this.props.goBack() 40 | return true 41 | } 42 | 43 | componentDidMount () { 44 | if (!ReduxPersist.active) { 45 | this.props.startup() 46 | } 47 | } 48 | 49 | render () { 50 | const { navigation } = this.props 51 | return ( 52 | 53 | 57 | 58 | 59 | ) 60 | } 61 | } 62 | 63 | const mapStateToProps = (state) => ({ 64 | navigation: state.primaryNav 65 | }) 66 | 67 | // wraps dispatch to create nicer functions to call within our component 68 | const mapDispatchToProps = (dispatch) => ({ 69 | startup: () => dispatch(StartupActions.startup()), 70 | goBack: () => dispatch(NavigationActions.back()) 71 | }) 72 | 73 | export default connect(mapStateToProps, mapDispatchToProps)(RootContainer) 74 | -------------------------------------------------------------------------------- /App/Containers/SpeakersScreen.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { connect } from 'react-redux' 3 | import styled from 'styled-components/native' 4 | import Icon from 'react-native-vector-icons/FontAwesome' 5 | 6 | import SpeakerListing from '../Components/SpeakerListing' 7 | import { Colors, Metrics } from '../Themes' 8 | 9 | const Screen = styled.View` 10 | background-color: ${Colors.background}; 11 | padding-bottom: 0; 12 | flex: 1; 13 | ` 14 | 15 | class SpeakersScreen extends Component { 16 | static navigationOptions = { 17 | tabBarLabel: 'Speakers', 18 | tabBarIcon: ({ tintColor }) => 19 | 20 | } 21 | 22 | render () { 23 | let { data } = this.props 24 | return ( 25 | 26 | 27 | 28 | ) 29 | } 30 | } 31 | 32 | const mapStateToProps = ({ speakers: {data} }) => ({ 33 | data 34 | }) 35 | 36 | export default connect(mapStateToProps)(SpeakersScreen) 37 | -------------------------------------------------------------------------------- /App/Containers/SponsorListScreen.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import SponsorList from '../Components/SponsorList' 3 | 4 | class SponsorListScreen extends Component { 5 | static navigationOptions = { 6 | drawerLabel: () => null 7 | } 8 | render () { 9 | return ( 10 | 11 | ) 12 | } 13 | } 14 | 15 | export default SponsorListScreen 16 | -------------------------------------------------------------------------------- /App/Containers/Styles/FeedbackScreenStyle.js: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from 'react-native' 2 | import { ApplicationStyles } from '../../Themes/' 3 | 4 | export default StyleSheet.create({ 5 | ...ApplicationStyles.screen 6 | }) 7 | -------------------------------------------------------------------------------- /App/Containers/Styles/LaunchScreenStyles.js: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from 'react-native' 2 | import { Metrics, ApplicationStyles } from '../../Themes/' 3 | 4 | export default StyleSheet.create({ 5 | ...ApplicationStyles.screen, 6 | container: { 7 | paddingBottom: Metrics.baseMargin 8 | }, 9 | logo: { 10 | marginTop: Metrics.doubleSection, 11 | height: Metrics.images.logo, 12 | width: Metrics.images.logo, 13 | resizeMode: 'contain' 14 | }, 15 | centered: { 16 | alignItems: 'center' 17 | } 18 | }) 19 | -------------------------------------------------------------------------------- /App/Containers/Styles/README.md: -------------------------------------------------------------------------------- 1 | ### Styles Folder 2 | Container styles are separated from functionality. 3 | -------------------------------------------------------------------------------- /App/Containers/Styles/RootContainerStyles.js: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from 'react-native' 2 | import {Fonts, Metrics, Colors} from '../../Themes' 3 | 4 | export default StyleSheet.create({ 5 | applicationView: { 6 | flex: 1 7 | }, 8 | container: { 9 | flex: 1, 10 | justifyContent: 'center', 11 | backgroundColor: Colors.background 12 | }, 13 | welcome: { 14 | fontSize: 20, 15 | textAlign: 'center', 16 | fontFamily: Fonts.type.base, 17 | margin: Metrics.baseMargin 18 | }, 19 | myImage: { 20 | width: 200, 21 | height: 200, 22 | alignSelf: 'center' 23 | } 24 | }) 25 | -------------------------------------------------------------------------------- /App/Containers/TalkDetailsScreen.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { connect } from 'react-redux' 3 | import styled from 'styled-components/native' 4 | 5 | import TalkDetail from '../Components/TalkDetail' 6 | import { Colors } from '../Themes' 7 | 8 | const Screen = styled.View` 9 | background-color: ${Colors.background}; 10 | flex: 1; 11 | flex-direction: row; 12 | ` 13 | 14 | class TalkDetailsScreen extends Component { 15 | render () { 16 | const { session, navigation } = this.props 17 | return ( 18 | 19 | 26 | 27 | ) 28 | } 29 | } 30 | 31 | const mapStateToProps = ({ schedule }) => ({ 32 | session: schedule.selectedSession 33 | }) 34 | 35 | export default connect(mapStateToProps)(TalkDetailsScreen) 36 | -------------------------------------------------------------------------------- /App/Containers/TalkScreen.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { connect } from 'react-redux' 3 | import styled from 'styled-components/native' 4 | 5 | import ScheduleActions from '../Redux/ScheduleRedux' 6 | import TalkListing from '../Components/TalkListing' 7 | import { Colors } from '../Themes' 8 | import { pathOr } from 'ramda' 9 | 10 | const Screen = styled.View` 11 | background-color: ${Colors.reactFinlandBlue}; 12 | flex: 1; 13 | ` 14 | 15 | class TalkScreen extends Component { 16 | render () { 17 | let { data, navigation, selectSession } = this.props 18 | const {state: {routeName}} = navigation 19 | const mapping = { 20 | 'Pre': pathOr([], ['0', 'intervals'], data), 21 | 'WorkshopScreen': pathOr([], ['1', 'intervals'], data), 22 | 'ThursdayScreen': pathOr([], ['2', 'intervals'], data), 23 | 'FridayScreen': pathOr([], ['3', 'intervals'], data) 24 | } 25 | return ( 26 | 27 | { 30 | selectSession(session) 31 | navigation.navigate('TalkDetails') 32 | }} 33 | /> 34 | 35 | ) 36 | } 37 | } 38 | 39 | const mapDispatchToProps = (dispatch) => ({ 40 | selectSession: (session) => dispatch(ScheduleActions.selectSession(session)) 41 | }) 42 | 43 | const mapStateToProps = ({schedule}) => ({ 44 | data: schedule.data 45 | }) 46 | 47 | export default connect(mapStateToProps, mapDispatchToProps)(TalkScreen) 48 | '' -------------------------------------------------------------------------------- /App/Images/Icons/back-button@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/back-button@2x.png -------------------------------------------------------------------------------- /App/Images/Icons/chevron-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/chevron-right@2x.png -------------------------------------------------------------------------------- /App/Images/Icons/close-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/close-button.png -------------------------------------------------------------------------------- /App/Images/Icons/close-button@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/close-button@2x.png -------------------------------------------------------------------------------- /App/Images/Icons/close-button@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/close-button@3x.png -------------------------------------------------------------------------------- /App/Images/Icons/faq-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/faq-icon.png -------------------------------------------------------------------------------- /App/Images/Icons/faq-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/faq-icon@2x.png -------------------------------------------------------------------------------- /App/Images/Icons/faq-icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/faq-icon@3x.png -------------------------------------------------------------------------------- /App/Images/Icons/hamburger@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/hamburger@2x.png -------------------------------------------------------------------------------- /App/Images/Icons/icon-api-testing@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/icon-api-testing@2x.png -------------------------------------------------------------------------------- /App/Images/Icons/icon-components@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/icon-components@2x.png -------------------------------------------------------------------------------- /App/Images/Icons/icon-device-information@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/icon-device-information@2x.png -------------------------------------------------------------------------------- /App/Images/Icons/icon-home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/icon-home@2x.png -------------------------------------------------------------------------------- /App/Images/Icons/icon-theme@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/icon-theme@2x.png -------------------------------------------------------------------------------- /App/Images/Icons/icon-usage-examples@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/Icons/icon-usage-examples@2x.png -------------------------------------------------------------------------------- /App/Images/README.md: -------------------------------------------------------------------------------- 1 | ### Images folder 2 | Holds all images for the applications. -------------------------------------------------------------------------------- /App/Images/alma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/alma.png -------------------------------------------------------------------------------- /App/Images/brigitte-tohm-64489-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/brigitte-tohm-64489-unsplash.jpg -------------------------------------------------------------------------------- /App/Images/dark-screen.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/dark-screen.jpeg -------------------------------------------------------------------------------- /App/Images/elisa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/elisa.png -------------------------------------------------------------------------------- /App/Images/geniem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/geniem.png -------------------------------------------------------------------------------- /App/Images/gofore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/gofore.png -------------------------------------------------------------------------------- /App/Images/graphql-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/graphql-background.png -------------------------------------------------------------------------------- /App/Images/graphql_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/graphql_logo.png -------------------------------------------------------------------------------- /App/Images/hermes-rivera-258743-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/hermes-rivera-258743-unsplash.jpg -------------------------------------------------------------------------------- /App/Images/motley.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/motley.png -------------------------------------------------------------------------------- /App/Images/nitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/nitor.png -------------------------------------------------------------------------------- /App/Images/react-finland-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/react-finland-background.png -------------------------------------------------------------------------------- /App/Images/reactfinland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/reactfinland.png -------------------------------------------------------------------------------- /App/Images/rf-logo-white-with-text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/rf-logo-white-with-text.png -------------------------------------------------------------------------------- /App/Images/rohea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/rohea.png -------------------------------------------------------------------------------- /App/Images/solita.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/solita.png -------------------------------------------------------------------------------- /App/Images/verkkokauppa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/App/Images/verkkokauppa.png -------------------------------------------------------------------------------- /App/Navigation/BuyTicketsLink.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { TouchableOpacity, Linking } from 'react-native' 3 | import styled from 'styled-components/native' 4 | 5 | import { Colors, Fonts } from '../Themes' 6 | 7 | const Link = styled.Text` 8 | font-size: ${Fonts.size.regular}; 9 | font-family: ${Fonts.type.base}; 10 | color: ${Colors.reactFinlandBlue} 11 | ` 12 | 13 | const openUrl = link => Linking.openURL(link).catch(err => { 14 | console.tron.log(`Failed to open link ${link}`) 15 | console.tron.log(err) 16 | }) 17 | 18 | const BuyTicketsLink = () => ( 19 | openUrl('https://react-finland.fi/#tickets')}> 20 | Buy Tickets 21 | 22 | ) 23 | 24 | export default BuyTicketsLink 25 | -------------------------------------------------------------------------------- /App/Navigation/MenuButton.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Icon from 'react-native-vector-icons/FontAwesome' 3 | import styled from 'styled-components/native' 4 | 5 | import { Colors, Metrics, Fonts } from '../Themes' 6 | 7 | const TouchableOpacity = styled.TouchableOpacity` 8 | padding-left: 10px 9 | height: 30px; 10 | width: 50px; 11 | flex-direction: row; 12 | align-items: center; 13 | margin-left: 10; 14 | ` 15 | 16 | const MenuButton = ({ onPress }) => ( 17 | 18 | 23 | 24 | ) 25 | 26 | export default MenuButton 27 | -------------------------------------------------------------------------------- /App/Navigation/PrimaryNavigation.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Platform } from 'react-native' 3 | import { DrawerNavigator, StackNavigator } from 'react-navigation' 4 | 5 | import AboutScreen from '../Containers/AboutScreen' 6 | import SpeakersScreen from '../Containers/SpeakersScreen' 7 | import ScheduleNavigation from './ScheduleNavigation' 8 | import OrganizersScreen from '../Containers/OrganizersScreen' 9 | import { Colors, Fonts } from '../Themes' 10 | import SideMenu from './SideMenu' 11 | import BuyTicketsLink from './BuyTicketsLink' 12 | import MenuButton from './MenuButton' 13 | import { headerTitleStyle } from './styles' 14 | import SponsorListScreen from '../Containers/SponsorListScreen' 15 | 16 | const OrganizersStack = StackNavigator({ 17 | OrganizerScreen: { 18 | screen: OrganizersScreen, 19 | navigationOptions: ({ navigation }) => { 20 | return { 21 | headerRight: , 22 | headerLeft: navigation.navigate('DrawerOpen')} />, 23 | title: 'Organizers', 24 | headerTitleStyle 25 | } 26 | } 27 | } 28 | }) 29 | const SponsorListStack = StackNavigator({ 30 | SponsorListScreen: { 31 | screen: SponsorListScreen, 32 | navigationOptions: ({ navigation }) => { 33 | return { 34 | headerRight: , 35 | headerLeft: navigation.navigate('DrawerOpen')} />, 36 | title: 'Sponsors', 37 | headerTitleStyle 38 | } 39 | } 40 | } 41 | }) 42 | const SpeakersStack = StackNavigator({ 43 | SpeakersScreen: { 44 | screen: SpeakersScreen, 45 | navigationOptions: ({ navigation }) => { 46 | return { 47 | headerRight: , 48 | headerLeft: navigation.navigate('DrawerOpen')} />, 49 | title: 'Speakers', 50 | headerTitleStyle 51 | } 52 | } 53 | } 54 | }) 55 | 56 | const AboutStack = StackNavigator({ 57 | AboutScreen: { 58 | screen: AboutScreen, 59 | navigationOptions: ({ navigation }) => { 60 | return { 61 | headerRight: , 62 | headerLeft: navigation.navigate('DrawerOpen')} />, 63 | title: 'About', 64 | headerTitleStyle 65 | } 66 | } 67 | } 68 | }) 69 | 70 | const DrawerNav = DrawerNavigator({ 71 | Schedule: { 72 | screen: ScheduleNavigation, 73 | navigationOptions: { 74 | title: 'Schedule' 75 | } 76 | }, 77 | Speakers: { 78 | screen: SpeakersStack 79 | }, 80 | Organizers: { 81 | screen: OrganizersStack 82 | }, 83 | About: { 84 | screen: AboutStack 85 | }, 86 | Sponsors: { 87 | screen: SponsorListStack 88 | } 89 | }, { 90 | drawerWidth: 250, 91 | contentOptions: { 92 | inactiveTintColor: 'rgba(255, 255, 255, 0.8)', 93 | activeTintColor: Colors.reactFinlandBlue, 94 | activeBackgroundColor: null, 95 | labelStyle: { 96 | fontSize: Fonts.size.h5, 97 | fontFamily: Fonts.type.bold, 98 | 99 | // For some reason, Android needs fontWeight: 'normal' here to display 100 | // Finlandica font. fontFamily: 'Finlandica-Bold' makes it bold. 101 | // With those settings, iOS does not display the font bolded but requires 102 | // fontWeight: 'bold'. 103 | fontWeight: Platform.OS === 'ios' ? 'bold' : 'normal' 104 | } 105 | }, 106 | contentComponent: props => ( 107 | 108 | ), 109 | drawerOpenRoute: 'DrawerOpen', 110 | drawerCloseRoute: 'DrawerClose', 111 | drawerToggleRoute: 'DrawerToggle' 112 | }) 113 | 114 | export default DrawerNav 115 | -------------------------------------------------------------------------------- /App/Navigation/ReduxPrimaryNavigation.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import * as ReactNavigation from 'react-navigation' 3 | import { connect } from 'react-redux' 4 | import PrimaryNavigation from './PrimaryNavigation' 5 | 6 | // here is our redux-aware our smart component 7 | function ReduxPrimaryNavigation (props) { 8 | const { dispatch, nav } = props 9 | const navigation = ReactNavigation.addNavigationHelpers({ 10 | dispatch, 11 | state: nav 12 | }) 13 | 14 | return 15 | } 16 | 17 | const mapStateToProps = state => ({ nav: state.primaryNav }) 18 | export default connect(mapStateToProps)(ReduxPrimaryNavigation) 19 | -------------------------------------------------------------------------------- /App/Navigation/ScheduleNavigation.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { TabNavigator, StackNavigator } from 'react-navigation' 3 | 4 | import TalkScreen from '../Containers/TalkScreen' 5 | import FeedbackScreen from '../Containers/FeedbackScreen' 6 | import TalkDetails from '../Containers/TalkDetailsScreen' 7 | 8 | import { Colors, Fonts } from '../Themes' 9 | import BuyTicketsLink from './BuyTicketsLink' 10 | import MenuButton from './MenuButton' 11 | import { headerTitleStyle } from './styles' 12 | 13 | const routeConfig = { 14 | WorkshopScreen: { 15 | screen: TalkScreen, 16 | navigationOptions: { 17 | title: 'Workshops' 18 | } 19 | }, 20 | ThursdayScreen: { 21 | screen: TalkScreen, 22 | navigationOptions: { 23 | title: 'Thursday' 24 | } 25 | }, 26 | FridayScreen: { 27 | screen: TalkScreen, 28 | navigationOptions: { 29 | title: 'Friday' 30 | } 31 | } 32 | } 33 | 34 | const tabNavigatorConfig = { 35 | // Default config for all screens 36 | tabBarPosition: 'bottom', 37 | animationEnabled: true, 38 | swipeEnabled: true, 39 | tabBarOptions: { 40 | animationEnabled: true, 41 | swipeEnabled: false, 42 | activeTintColor: Colors.snow, 43 | inactiveTintColor: Colors.coal, 44 | style: { 45 | backgroundColor: Colors.reactFinlandBlue, 46 | paddingBottom: 15 47 | }, 48 | labelStyle: { 49 | fontFamily: Fonts.type.base, 50 | fontSize: Fonts.size.medium 51 | } 52 | } 53 | } 54 | 55 | // Manifest of possible screens 56 | const ScheduleNav = TabNavigator(routeConfig, tabNavigatorConfig) 57 | 58 | const ScheduleStack = StackNavigator({ 59 | Schedule: { 60 | screen: ScheduleNav, 61 | navigationOptions: ({ navigation }) => { 62 | return { 63 | headerRight: , 64 | headerLeft: navigation.navigate('DrawerOpen')} />, 65 | title: 'Schedule', 66 | headerTitleStyle 67 | } 68 | } 69 | }, 70 | FeedbackScreen: { 71 | screen: FeedbackScreen, 72 | navigationOptions: { 73 | headerRight: , 74 | headerBackTitleStyle: { 75 | fontFamily: Fonts.type.base, 76 | fontSize: Fonts.size.regular, 77 | color: Colors.reactFinlandBlue 78 | } 79 | } 80 | }, 81 | TalkDetails: { 82 | screen: TalkDetails, 83 | navigationOptions: { 84 | headerRight: , 85 | headerBackTitleStyle: { 86 | fontFamily: Fonts.type.base, 87 | fontSize: Fonts.size.regular, 88 | color: Colors.reactFinlandBlue 89 | } 90 | } 91 | } 92 | }) 93 | 94 | export default ScheduleStack 95 | -------------------------------------------------------------------------------- /App/Navigation/SideMenu.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | // import PropTypes from 'prop-types'; 3 | import { View, ScrollView, TouchableHighlight } from 'react-native' 4 | import { DrawerItems } from 'react-navigation' 5 | import styled from 'styled-components/native' 6 | import { Metrics, Fonts } from '../Themes' 7 | import Icon from 'react-native-vector-icons/FontAwesome' 8 | import { connect } from 'react-redux' 9 | import { pathOr } from 'ramda' 10 | const BackgroundImage = styled.ImageBackground` 11 | flex: 1; 12 | justify-content: space-between; 13 | background-color: rgba(0,0,0, 0.9); 14 | ` 15 | 16 | const LogoImage = styled.ImageBackground` 17 | flex: 1; 18 | margin-bottom: 0px; 19 | margin-top: -10px; 20 | width: ${props => props.width}; 21 | height: ${props => props.height}; 22 | ` 23 | export const GoldImage = styled.Image` 24 | margin-left: 20px; 25 | height: 50px; 26 | width: 100; 27 | ` 28 | export const SilverImage = styled.Image` 29 | margin-left: 15px; 30 | height: 50px; 31 | width: 65; 32 | ` 33 | export const BronzeImage = styled.Image` 34 | margin-left: 20px; 35 | height: 25px; 36 | width: 50; 37 | ` 38 | const Text = styled.Text` 39 | color: ${props => props.textcolor}; 40 | text-align: center; 41 | padding-left: 20; 42 | padding-bottom: 5px; 43 | padding-right: 30; 44 | font-size: ${Fonts.size.small}; 45 | font-family: ${Fonts.type.base}; 46 | ` 47 | const AllSponsorsLink = styled.Text` 48 | color: ${props => props.textcolor}; 49 | text-align: center; 50 | padding-left: 20; 51 | padding-bottom: 5px; 52 | padding-top: 10; 53 | padding-right: 30; 54 | font-size: ${Fonts.size.h2}; 55 | font-family: ${Fonts.type.base}; 56 | ` 57 | const Wrapper = styled.View` 58 | flex: 1; 59 | flex-direction: row; 60 | justify-content: space-between; 61 | 62 | padding-right: 10px; 63 | padding-top: 10px; 64 | ` 65 | 66 | class SideMenu extends Component { 67 | render () { 68 | const { props } = this 69 | const { navigation } = props 70 | return ( 71 | 72 | 73 | 74 | 75 | 76 | 77 | navigation.navigate('DrawerClose')}> 78 | 79 | 80 | 81 | 82 | 83 | navigation.navigate('Sponsors')}> 84 | Sponsors 85 | 86 | 87 | ) 88 | } 89 | } 90 | 91 | const mapStateToProps = ({sponsors}) => ({ 92 | gold: pathOr([], ['data', 'goldSponsors'], sponsors) 93 | }) 94 | 95 | export default connect(mapStateToProps)(SideMenu) -------------------------------------------------------------------------------- /App/Navigation/styles.js: -------------------------------------------------------------------------------- 1 | import { Colors, Fonts } from '../Themes' 2 | 3 | export const headerTitleStyle = { 4 | fontFamily: Fonts.type.base, 5 | fontSize: Fonts.size.regular, 6 | fontWeight: 'normal', 7 | color: Colors.coal, 8 | alignSelf: 'center' 9 | } 10 | -------------------------------------------------------------------------------- /App/Redux/CreateStore.js: -------------------------------------------------------------------------------- 1 | import { createStore, applyMiddleware, compose } from 'redux' 2 | import { autoRehydrate } from 'redux-persist' 3 | import Config from '../Config/DebugConfig' 4 | import createSagaMiddleware from 'redux-saga' 5 | import RehydrationServices from '../Services/RehydrationServices' 6 | import ReduxPersist from '../Config/ReduxPersist' 7 | import ScreenTracking from './ScreenTrackingMiddleware' 8 | 9 | // creates the store 10 | export default (rootReducer, rootSaga) => { 11 | /* ------------- Redux Configuration ------------- */ 12 | 13 | const middleware = [] 14 | const enhancers = [] 15 | 16 | /* ------------- Analytics Middleware ------------- */ 17 | middleware.push(ScreenTracking) 18 | 19 | /* ------------- Saga Middleware ------------- */ 20 | 21 | const sagaMonitor = Config.useReactotron ? console.tron.createSagaMonitor() : null 22 | const sagaMiddleware = createSagaMiddleware({ sagaMonitor }) 23 | middleware.push(sagaMiddleware) 24 | 25 | /* ------------- Assemble Middleware ------------- */ 26 | 27 | enhancers.push(applyMiddleware(...middleware)) 28 | 29 | /* ------------- AutoRehydrate Enhancer ------------- */ 30 | 31 | // add the autoRehydrate enhancer 32 | if (ReduxPersist.active) { 33 | enhancers.push(autoRehydrate()) 34 | } 35 | 36 | // if Reactotron is enabled (default for __DEV__), we'll create the store through Reactotron 37 | const createAppropriateStore = Config.useReactotron ? console.tron.createStore : createStore 38 | const store = createAppropriateStore(rootReducer, compose(...enhancers)) 39 | 40 | // configure persistStore and check reducer version number 41 | if (ReduxPersist.active) { 42 | RehydrationServices.updateReducers(store) 43 | } 44 | 45 | // kick off root saga 46 | sagaMiddleware.run(rootSaga) 47 | 48 | return store 49 | } 50 | -------------------------------------------------------------------------------- /App/Redux/OrganizersRedux.js: -------------------------------------------------------------------------------- 1 | import { createReducer, createActions } from 'reduxsauce' 2 | import Immutable from 'seamless-immutable' 3 | 4 | /* ------------- Types and Action Creators ------------- */ 5 | 6 | const { Types, Creators } = createActions({ 7 | organizersUpdate: null, 8 | organizersRequest: ['data'], 9 | organizersSuccess: ['payload'], 10 | organizersFailure: null 11 | }) 12 | 13 | export const OrganizersTypes = Types 14 | export default Creators 15 | 16 | /* ------------- Initial State ------------- */ 17 | 18 | export const INITIAL_STATE = Immutable({ 19 | data: null, 20 | fetching: null, 21 | error: null 22 | }) 23 | 24 | /* ------------- Reducers ------------- */ 25 | 26 | // request the data from an api 27 | export const request = (state) => 28 | state.merge({ fetching: true, payload: null }) 29 | 30 | // successful api lookup 31 | export const success = (state, action) => { 32 | const { payload: data } = action 33 | return state.merge({ fetching: false, error: null, data }) 34 | } 35 | 36 | // Something went wrong somewhere. 37 | export const failure = state => 38 | state.merge({ fetching: false, error: true, payload: null }) 39 | 40 | /* ------------- Hookup Reducers To Types ------------- */ 41 | 42 | export const reducer = createReducer(INITIAL_STATE, { 43 | [Types.ORGANIZERS_REQUEST]: request, 44 | [Types.ORGANIZERS_SUCCESS]: success, 45 | [Types.ORGANIZERS_FAILURE]: failure 46 | }) 47 | -------------------------------------------------------------------------------- /App/Redux/PrimaryNavigationRedux.js: -------------------------------------------------------------------------------- 1 | import PrimaryNavigation from '../Navigation/PrimaryNavigation' 2 | import * as R from 'ramda' 3 | 4 | export const reducer = (state, action) => { 5 | const drawerOpen = R.cond([ 6 | [R.equals('DrawerOpen'), R.always(true)], 7 | [R.equals('DrawerClose'), R.always(false)], 8 | [R.T, R.always(false)] 9 | ])(action.routeName) 10 | 11 | const newState = PrimaryNavigation.router.getStateForAction(action, state) 12 | return newState ? {...newState, drawerOpen} : state 13 | } 14 | -------------------------------------------------------------------------------- /App/Redux/ScheduleRedux.js: -------------------------------------------------------------------------------- 1 | import { createReducer, createActions } from 'reduxsauce' 2 | import Immutable from 'seamless-immutable' 3 | 4 | /* ------------- Types and Action Creators ------------- */ 5 | 6 | const { Types, Creators } = createActions({ 7 | scheduleUpdate: null, 8 | scheduleRequest: ['data'], 9 | scheduleSuccess: ['payload'], 10 | selectSession: ['session'], 11 | scheduleFailure: null 12 | }) 13 | 14 | export const ScheduleTypes = Types 15 | export default Creators 16 | 17 | /* ------------- Initial State ------------- */ 18 | 19 | export const INITIAL_STATE = Immutable({ 20 | data: null, 21 | fetching: false, 22 | selectedSession: null 23 | }) 24 | 25 | /* ------------- Reducers ------------- */ 26 | 27 | const selectSession = (state, { session }) => 28 | state.setIn(['selectedSession'], session) 29 | 30 | export const request = (state) => 31 | state.merge({ fetching: true, payload: null }) 32 | 33 | export const success = (state, action) => { 34 | const { payload: data } = action 35 | return state.merge({ fetching: false, error: null, data }) 36 | } 37 | 38 | export const failure = state => 39 | state.merge({ fetching: false, error: true, payload: null }) 40 | /* ------------- Hookup Reducers To Types ------------- */ 41 | 42 | export const reducer = createReducer(INITIAL_STATE, { 43 | [Types.SCHEDULE_REQUEST]: request, 44 | [Types.SCHEDULE_SUCCESS]: success, 45 | [Types.SCHEDULE_FAILURE]: failure, 46 | [Types.SELECT_SESSION]: selectSession 47 | }) 48 | -------------------------------------------------------------------------------- /App/Redux/ScreenTrackingMiddleware.js: -------------------------------------------------------------------------------- 1 | import { NavigationActions } from 'react-navigation' 2 | 3 | // gets the current screen from navigation state 4 | const getCurrentRouteName = (navigationState) => { 5 | if (!navigationState) { 6 | return null 7 | } 8 | const route = navigationState.routes[navigationState.index] 9 | // dive into nested navigators 10 | if (route.routes) { 11 | return getCurrentRouteName(route) 12 | } 13 | return route.routeName 14 | } 15 | 16 | const screenTracking = ({ getState }) => next => (action) => { 17 | if ( 18 | action.type !== NavigationActions.NAVIGATE && 19 | action.type !== NavigationActions.BACK 20 | ) { 21 | return next(action) 22 | } 23 | 24 | const currentScreen = getCurrentRouteName(getState().nav) 25 | const result = next(action) 26 | const nextScreen = getCurrentRouteName(getState().nav) 27 | if (nextScreen !== currentScreen) { 28 | try { 29 | console.tron.log(`NAVIGATING ${currentScreen} to ${nextScreen}`) 30 | // Example: Analytics.trackEvent('user_navigation', {currentScreen, nextScreen}) 31 | } catch (e) { 32 | console.tron.log(e) 33 | } 34 | } 35 | return result 36 | } 37 | 38 | export default screenTracking 39 | -------------------------------------------------------------------------------- /App/Redux/SpeakersRedux.js: -------------------------------------------------------------------------------- 1 | import { createReducer, createActions } from 'reduxsauce' 2 | import Immutable from 'seamless-immutable' 3 | 4 | /* ------------- Types and Action Creators ------------- */ 5 | 6 | const { Types, Creators } = createActions({ 7 | speakersUpdate: null, 8 | speakersRequest: ['data'], 9 | speakersSuccess: ['payload'], 10 | speakersFailure: null 11 | }) 12 | 13 | export const SpeakersTypes = Types 14 | export default Creators 15 | 16 | /* ------------- Initial State ------------- */ 17 | 18 | export const INITIAL_STATE = Immutable({ 19 | data: null, 20 | fetching: null, 21 | error: null 22 | }) 23 | 24 | /* ------------- Reducers ------------- */ 25 | 26 | // request the data from an api 27 | export const request = (state) => 28 | state.merge({ fetching: true, payload: null }) 29 | 30 | // successful api lookup 31 | export const success = (state, action) => { 32 | const { payload: data } = action 33 | return state.merge({ fetching: false, error: null, data }) 34 | } 35 | 36 | // Something went wrong somewhere. 37 | export const failure = state => 38 | state.merge({ fetching: false, error: true, payload: null }) 39 | 40 | /* ------------- Hookup Reducers To Types ------------- */ 41 | 42 | export const reducer = createReducer(INITIAL_STATE, { 43 | [Types.SPEAKERS_REQUEST]: request, 44 | [Types.SPEAKERS_SUCCESS]: success, 45 | [Types.SPEAKERS_FAILURE]: failure 46 | }) 47 | -------------------------------------------------------------------------------- /App/Redux/SponsorsRedux.js: -------------------------------------------------------------------------------- 1 | import { createReducer, createActions } from 'reduxsauce' 2 | import Immutable from 'seamless-immutable' 3 | 4 | /* ------------- Types and Action Creators ------------- */ 5 | 6 | const { Types, Creators } = createActions({ 7 | sponsorsUpdate: null, 8 | sponsorsRequest: ['data'], 9 | sponsorsSuccess: ['payload'], 10 | sponsorsFailure: null 11 | }) 12 | 13 | export const sponsorsTypes = Types 14 | export default Creators 15 | 16 | /* ------------- Initial State ------------- */ 17 | 18 | export const INITIAL_STATE = Immutable({ 19 | data: null, 20 | fetching: null, 21 | error: null 22 | }) 23 | 24 | /* ------------- Reducers ------------- */ 25 | 26 | // request the data from an api 27 | export const request = (state) => 28 | state.merge({ fetching: true, payload: null }) 29 | 30 | // successful api lookup 31 | export const success = (state, action) => { 32 | const { payload: data } = action 33 | return state.merge({ fetching: false, error: null, data }) 34 | } 35 | 36 | // Something went wrong somewhere. 37 | export const failure = state => 38 | state.merge({ fetching: false, error: true, payload: null }) 39 | 40 | /* ------------- Hookup Reducers To Types ------------- */ 41 | 42 | export const reducer = createReducer(INITIAL_STATE, { 43 | [Types.SPONSORS_REQUEST]: request, 44 | [Types.SPONSORS_SUCCESS]: success, 45 | [Types.SPONSORS_FAILURE]: failure 46 | }) 47 | -------------------------------------------------------------------------------- /App/Redux/StartupRedux.js: -------------------------------------------------------------------------------- 1 | import { createActions } from 'reduxsauce' 2 | 3 | /* ------------- Types and Action Creators ------------- */ 4 | 5 | const { Types, Creators } = createActions({ 6 | startup: null 7 | }) 8 | 9 | export const StartupTypes = Types 10 | export default Creators 11 | -------------------------------------------------------------------------------- /App/Redux/index.js: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux' 2 | 3 | import configureStore from './CreateStore' 4 | import rootSaga from '../Sagas/' 5 | import { SponsorContainer } from '../Components/SponsorList/SponsorList'; 6 | 7 | export default apollo => { 8 | /* ------------- Assemble The Reducers ------------- */ 9 | const rootReducer = combineReducers({ 10 | primaryNav: require('./PrimaryNavigationRedux').reducer, 11 | schedule: require('./ScheduleRedux').reducer, 12 | speakers: require('./SpeakersRedux').reducer, 13 | sponsors: require('./SponsorsRedux').reducer, 14 | organizers: require('./OrganizersRedux').reducer 15 | }) 16 | 17 | return configureStore(rootReducer, rootSaga) 18 | } 19 | -------------------------------------------------------------------------------- /App/Sagas/OrganizersSagas.js: -------------------------------------------------------------------------------- 1 | import { put, call } from 'redux-saga/effects' 2 | import gql from 'graphql-tag' 3 | 4 | import OrganizersActions from '../Redux/OrganizersRedux' 5 | 6 | const getOrganizers = { 7 | query: gql` 8 | { 9 | organizers { 10 | name 11 | about 12 | image 13 | location { 14 | country { 15 | name 16 | code 17 | } 18 | } 19 | social { 20 | twitter 21 | homepage 22 | github 23 | linkedin 24 | } 25 | } 26 | }` 27 | } 28 | 29 | // process STARTUP actions 30 | export function * updateOrganizers (client, action) { 31 | yield put(OrganizersActions.organizersRequest()) 32 | try { 33 | const {data: { organizers }} = yield call(client.query, getOrganizers) 34 | yield put(OrganizersActions.organizersSuccess(organizers)) 35 | } catch (err) { 36 | yield put(OrganizersActions.organizersFailure()) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /App/Sagas/SchedulesSagas.js: -------------------------------------------------------------------------------- 1 | import { put, call } from 'redux-saga/effects' 2 | import gql from 'graphql-tag' 3 | 4 | import ScheduleActions from '../Redux/ScheduleRedux' 5 | 6 | const getSchedules = { 7 | query: gql` 8 | { 9 | conference(id: "react-finland-2019") { 10 | schedules { 11 | day, 12 | intervals { 13 | title 14 | begin 15 | end 16 | sessions { 17 | title 18 | description 19 | type 20 | speakers { 21 | name 22 | image { 23 | url 24 | } 25 | } 26 | } 27 | } 28 | } 29 | } 30 | }` 31 | } 32 | 33 | // process STARTUP actions 34 | export function * updateSchedule (client, action) { 35 | yield put(ScheduleActions.scheduleRequest()) 36 | try { 37 | const { data: {conference: { schedules } } } = yield call(client.query, getSchedules) 38 | yield put(ScheduleActions.scheduleSuccess(schedules)) 39 | } catch (err) { 40 | yield put(ScheduleActions.scheduleFailure()) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /App/Sagas/SpeakersSagas.js: -------------------------------------------------------------------------------- 1 | import { put, call } from 'redux-saga/effects' 2 | import gql from 'graphql-tag' 3 | 4 | // process STARTUP actions 5 | export function * updateSpeakers (client, action) { 6 | } 7 | -------------------------------------------------------------------------------- /App/Sagas/SponsorsSagas.js: -------------------------------------------------------------------------------- 1 | import { put, call } from 'redux-saga/effects' 2 | import gql from 'graphql-tag' 3 | 4 | import SponsorsActions from '../Redux/SponsorsRedux' 5 | 6 | const getSponsors = { 7 | query: gql` 8 | { 9 | conference(id: "react-finland-2019") { 10 | goldSponsors { 11 | name 12 | image { 13 | url 14 | } 15 | } 16 | silverSponsors { 17 | name 18 | image { 19 | url 20 | } 21 | } 22 | bronzeSponsors { 23 | name 24 | image { 25 | url 26 | } 27 | } 28 | } 29 | } 30 | ` 31 | } 32 | 33 | export function * updateSponsors (client, action) { 34 | yield put(SponsorsActions.sponsorsRequest()) 35 | try { 36 | const {data: {conference: { goldSponsors, silverSponsors, bronzeSponsors }}} = yield call(client.query, getSponsors) 37 | yield put(SponsorsActions.sponsorsSuccess({ goldSponsors, silverSponsors, bronzeSponsors })) 38 | } catch (err) { 39 | yield put(SponsorsActions.sponsorsFailure()) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /App/Sagas/StartupSagas.js: -------------------------------------------------------------------------------- 1 | import { put } from 'redux-saga/effects' 2 | 3 | import ScheduleActions from '../Redux/ScheduleRedux' 4 | import OrganizersActions from '../Redux/OrganizersRedux' 5 | import SpeakersActions from '../Redux/SpeakersRedux' 6 | import SponsorsActions from '../Redux/SponsorsRedux' 7 | 8 | // process STARTUP actions 9 | export function * startup (action) { 10 | yield put(ScheduleActions.scheduleUpdate()) 11 | yield put(OrganizersActions.organizersUpdate()) 12 | yield put(SpeakersActions.speakersUpdate()) 13 | yield put(SponsorsActions.sponsorsUpdate()) 14 | 15 | } 16 | -------------------------------------------------------------------------------- /App/Sagas/fragmentTypes.json: -------------------------------------------------------------------------------- 1 | {"__schema":{"types":[{"kind":"INTERFACE","name":"Session","possibleTypes":[{"name":"Talk"},{"name":"Workshop"},{"name":"Break"}]}]}} -------------------------------------------------------------------------------- /App/Sagas/index.js: -------------------------------------------------------------------------------- 1 | import { takeLatest, all } from 'redux-saga/effects' 2 | import ApolloClient from 'apollo-client-preset' 3 | import { HttpLink } from 'apollo-link-http' 4 | import { InMemoryCache } from 'apollo-cache-inmemory' 5 | import { persistCache } from 'apollo-cache-persist'; 6 | import { AsyncStorage } from 'react-native'; 7 | 8 | /* ------------- Types ------------- */ 9 | 10 | import { StartupTypes } from '../Redux/StartupRedux' 11 | import { ScheduleTypes } from '../Redux/ScheduleRedux' 12 | import { OrganizersTypes } from '../Redux/OrganizersRedux' 13 | import { SpeakersTypes } from '../Redux/SpeakersRedux' 14 | import { sponsorsTypes } from '../Redux/SponsorsRedux' 15 | 16 | /* ------------- Sagas ------------- */ 17 | 18 | import { startup } from './StartupSagas' 19 | import { updateSchedule } from './SchedulesSagas' 20 | import { updateSpeakers } from './SpeakersSagas' 21 | import { updateSponsors } from './SponsorsSagas' 22 | import { IntrospectionFragmentMatcher } from 'apollo-cache-inmemory'; 23 | import introspectionQueryResultData from './fragmentTypes.json'; 24 | 25 | const fragmentMatcher = new IntrospectionFragmentMatcher({ 26 | introspectionQueryResultData 27 | }); 28 | const cache = new InMemoryCache({fragmentMatcher}) 29 | const client = new ApolloClient({ 30 | link: new HttpLink({ uri: 'https://api.react-finland.fi/graphql' }), 31 | cache 32 | }) 33 | // The API we use is only used from Sagas, so we create it here and pass along 34 | // to the sagas which need it. 35 | // const api = DebugConfig.useFixtures ? FixtureAPI : API.create() 36 | 37 | /* ------------- Connect Types To Sagas ------------- */ 38 | export default function * root () { 39 | yield all([ 40 | takeLatest(StartupTypes.STARTUP, startup), 41 | takeLatest(ScheduleTypes.SCHEDULE_UPDATE, updateSchedule, client), 42 | takeLatest(sponsorsTypes.SPONSORS_UPDATE, updateSponsors, client), 43 | takeLatest(SpeakersTypes.SPEAKERS_UPDATE, updateSpeakers, client) 44 | ]) 45 | } 46 | -------------------------------------------------------------------------------- /App/Services/ImmutablePersistenceTransform.js: -------------------------------------------------------------------------------- 1 | import R from 'ramda' 2 | import Immutable from 'seamless-immutable' 3 | 4 | // is this object already Immutable? 5 | const isImmutable = R.has('asMutable') 6 | 7 | // change this Immutable object into a JS object 8 | const convertToJs = (state) => state.asMutable({deep: true}) 9 | 10 | // optionally convert this object into a JS object if it is Immutable 11 | const fromImmutable = R.when(isImmutable, convertToJs) 12 | 13 | // convert this JS object into an Immutable object 14 | const toImmutable = (raw) => Immutable(raw) 15 | 16 | // the transform interface that redux-persist is expecting 17 | export default { 18 | out: (state) => { 19 | // console.log({ retrieving: state }) 20 | return toImmutable(state) 21 | }, 22 | in: (raw) => { 23 | // console.log({ storing: raw }) 24 | return fromImmutable(raw) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /App/Services/RehydrationServices.js: -------------------------------------------------------------------------------- 1 | import ReduxPersist from '../Config/ReduxPersist' 2 | import { AsyncStorage } from 'react-native' 3 | import { persistStore } from 'redux-persist' 4 | import StartupActions from '../Redux/StartupRedux' 5 | import DebugConfig from '../Config/DebugConfig' 6 | 7 | const updateReducers = (store: Object) => { 8 | const reducerVersion = ReduxPersist.reducerVersion 9 | const config = ReduxPersist.storeConfig 10 | const startup = () => store.dispatch(StartupActions.startup()) 11 | 12 | // Check to ensure latest reducer version 13 | AsyncStorage.getItem('reducerVersion').then((localVersion) => { 14 | if (localVersion !== reducerVersion) { 15 | if (DebugConfig.useReactotron) { 16 | console.tron.display({ 17 | name: 'PURGE', 18 | value: { 19 | 'Old Version:': localVersion, 20 | 'New Version:': reducerVersion 21 | }, 22 | preview: 'Reducer Version Change Detected', 23 | important: true 24 | }) 25 | } 26 | // Purge store 27 | persistStore(store, config, startup).purge() 28 | AsyncStorage.setItem('reducerVersion', reducerVersion) 29 | } else { 30 | persistStore(store, config, startup) 31 | } 32 | }).catch(() => { 33 | persistStore(store, config, startup) 34 | AsyncStorage.setItem('reducerVersion', reducerVersion) 35 | }) 36 | } 37 | 38 | export default {updateReducers} 39 | -------------------------------------------------------------------------------- /App/Themes/ApplicationStyles.js: -------------------------------------------------------------------------------- 1 | import Fonts from './Fonts' 2 | import Metrics from './Metrics' 3 | import Colors from './Colors' 4 | 5 | // This file is for a reusable grouping of Theme items. 6 | // Similar to an XML fragment layout in Android 7 | 8 | const ApplicationStyles = { 9 | screen: { 10 | mainContainer: { 11 | flex: 1, 12 | backgroundColor: Colors.transparent 13 | }, 14 | backgroundImage: { 15 | position: 'absolute', 16 | top: 0, 17 | left: 0, 18 | bottom: 0, 19 | right: 0 20 | }, 21 | container: { 22 | flex: 1, 23 | paddingTop: Metrics.baseMargin, 24 | backgroundColor: Colors.transparent 25 | }, 26 | section: { 27 | margin: Metrics.section, 28 | padding: Metrics.baseMargin 29 | }, 30 | sectionText: { 31 | ...Fonts.style.normal, 32 | paddingVertical: Metrics.doubleBaseMargin, 33 | color: Colors.snow, 34 | marginVertical: Metrics.smallMargin, 35 | textAlign: 'center' 36 | }, 37 | subtitle: { 38 | color: Colors.snow, 39 | padding: Metrics.smallMargin, 40 | marginBottom: Metrics.smallMargin, 41 | marginHorizontal: Metrics.smallMargin 42 | }, 43 | titleText: { 44 | ...Fonts.style.h2, 45 | fontSize: 14, 46 | color: Colors.text 47 | } 48 | }, 49 | darkLabelContainer: { 50 | padding: Metrics.smallMargin, 51 | paddingBottom: Metrics.doubleBaseMargin, 52 | borderBottomColor: Colors.border, 53 | borderBottomWidth: 1, 54 | marginBottom: Metrics.baseMargin 55 | }, 56 | darkLabel: { 57 | fontFamily: Fonts.type.bold, 58 | color: Colors.snow 59 | }, 60 | groupContainer: { 61 | margin: Metrics.smallMargin, 62 | flexDirection: 'row', 63 | justifyContent: 'space-around', 64 | alignItems: 'center' 65 | }, 66 | sectionTitle: { 67 | ...Fonts.style.h4, 68 | color: Colors.coal, 69 | backgroundColor: Colors.ricePaper, 70 | padding: Metrics.smallMargin, 71 | marginTop: Metrics.smallMargin, 72 | marginHorizontal: Metrics.baseMargin, 73 | borderWidth: 1, 74 | borderColor: Colors.ember, 75 | alignItems: 'center', 76 | textAlign: 'center' 77 | } 78 | } 79 | 80 | export default ApplicationStyles 81 | -------------------------------------------------------------------------------- /App/Themes/Colors.js: -------------------------------------------------------------------------------- 1 | const colors = { 2 | reactFinlandBlue: '#5397E9', 3 | background: '#5397E9', 4 | clear: 'rgba(0,0,0,0)', 5 | facebook: '#3b5998', 6 | transparent: 'rgba(0,0,0,0)', 7 | silver: '#F7F7F7', 8 | steel: '#CCCCCC', 9 | error: 'rgba(200, 0, 0, 0.8)', 10 | ricePaper: 'rgba(255,255,255, 0.75)', 11 | frost: '#D8D8D8', 12 | cloud: 'rgba(200,200,200, 0.35)', 13 | windowTint: 'rgba(0, 0, 0, 0.4)', 14 | panther: '#161616', 15 | charcoal: '#595959', 16 | coal: '#2d2d2d', 17 | bloodOrange: '#fb5f26', 18 | snow: '#ffffff', 19 | ember: 'rgba(164, 0, 48, 0.5)', 20 | fire: '#e73536', 21 | drawer: 'rgba(30, 30, 29, 0.95)', 22 | eggplant: '#251a34', 23 | border: '#483F53', 24 | banner: '#5F3E63', 25 | text: '#F7F7F7', 26 | grey: '#e3e5e8' 27 | } 28 | 29 | export default colors 30 | -------------------------------------------------------------------------------- /App/Themes/Fonts.js: -------------------------------------------------------------------------------- 1 | const type = { 2 | base: 'Finlandica-Regular', 3 | bold: 'Finlandica-Bold', 4 | emphasis: 'HelveticaNeue-Italic' 5 | } 6 | 7 | const size = { 8 | h1: 34, 9 | h2: 32, 10 | h3: 30, 11 | h4: 26, 12 | h5: 20, 13 | h6: 19, 14 | input: 18, 15 | regular: 17, 16 | medium: 14, 17 | small: 12, 18 | tiny: 8.5 19 | } 20 | 21 | const style = { 22 | h1: { 23 | fontFamily: type.base, 24 | fontSize: size.h1 25 | }, 26 | h2: { 27 | fontWeight: 'bold', 28 | fontSize: size.h2 29 | }, 30 | h3: { 31 | fontFamily: type.emphasis, 32 | fontSize: size.h3 33 | }, 34 | h4: { 35 | fontFamily: type.base, 36 | fontSize: size.h4 37 | }, 38 | h5: { 39 | fontFamily: type.base, 40 | fontSize: size.h5 41 | }, 42 | h6: { 43 | fontFamily: type.emphasis, 44 | fontSize: size.h6 45 | }, 46 | normal: { 47 | fontFamily: type.base, 48 | fontSize: size.regular 49 | }, 50 | description: { 51 | fontFamily: type.base, 52 | fontSize: size.medium 53 | } 54 | } 55 | 56 | export default { 57 | type, 58 | size, 59 | style 60 | } 61 | -------------------------------------------------------------------------------- /App/Themes/Images.js: -------------------------------------------------------------------------------- 1 | // leave off @2x/@3x 2 | const images = { 3 | darkScreen: require('../Images/dark-screen.jpeg') 4 | } 5 | 6 | export default images 7 | -------------------------------------------------------------------------------- /App/Themes/Metrics.js: -------------------------------------------------------------------------------- 1 | import {Dimensions, Platform} from 'react-native' 2 | 3 | const { width, height } = Dimensions.get('window') 4 | 5 | // Used via Metrics.baseMargin 6 | const metrics = { 7 | marginHorizontal: 10, 8 | marginVertical: 10, 9 | section: 25, 10 | baseMargin: 10, 11 | doubleBaseMargin: 20, 12 | smallMargin: 5, 13 | doubleSection: 50, 14 | horizontalLineHeight: 1, 15 | searchBarHeight: 30, 16 | screenWidth: width < height ? width : height, 17 | screenHeight: width < height ? height : width, 18 | navBarHeight: (Platform.OS === 'ios') ? 64 : 54, 19 | buttonRadius: 4, 20 | icons: { 21 | tiny: 15, 22 | small: 20, 23 | medium: 30, 24 | large: 45, 25 | xl: 50 26 | }, 27 | images: { 28 | small: 20, 29 | medium: 40, 30 | large: 60, 31 | logo: 200 32 | } 33 | } 34 | 35 | export default metrics 36 | -------------------------------------------------------------------------------- /App/Themes/README.md: -------------------------------------------------------------------------------- 1 | ### Themes Folder 2 | Application specific themes 3 | * Base Styles 4 | * Fonts 5 | * Metrics 6 | * Colors 7 | 8 | etc. 9 | -------------------------------------------------------------------------------- /App/Themes/index.js: -------------------------------------------------------------------------------- 1 | import Colors from './Colors' 2 | import Fonts from './Fonts' 3 | import Metrics from './Metrics' 4 | import Images from './Images' 5 | import ApplicationStyles from './ApplicationStyles' 6 | 7 | export { Colors, Fonts, Images, Metrics, ApplicationStyles } 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 React Finland Ry 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React Finland App 2 | [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](http://standardjs.com/) 3 | 4 | Ios and Android app for react-finland conference 5 | 6 | **Step 1:** git clone this repo: 7 | 8 | **Step 2:** cd to the cloned repo: 9 | 10 | **Step 3:** Install the Application with `yarn` or `npm i` 11 | 12 | ## How to Run App 13 | 14 | 1. cd to the repo 15 | 2. Run Build for either OS 16 | * for iOS 17 | * run `react-native run-ios` 18 | * for Android 19 | * Run Genymotion 20 | * run `react-native run-android` 21 | 22 | ## :no_entry_sign: Standard Compliant 23 | 24 | [![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard) 25 | This project adheres to Standard. Our CI enforces this, so we suggest you enable linting to keep your project compliant during development. 26 | 27 | **To Lint on Commit** 28 | 29 | This is implemented using [husky](https://github.com/typicode/husky). There is no additional setup needed. 30 | 31 | **Bypass Lint** 32 | 33 | If you have to bypass lint for a special commit that you will come back and clean (pushing something to a branch etc.) then you can bypass git hooks with adding `--no-verify` to your commit command. 34 | 35 | **Understanding Linting Errors** 36 | 37 | The linting rules are from JS Standard and React-Standard. [Regular JS errors can be found with descriptions here](http://eslint.org/docs/rules/), while [React errors and descriptions can be found here](https://github.com/yannickcr/eslint-plugin-react). 38 | 39 | ## :closed_lock_with_key: Secrets 40 | 41 | This project uses [react-native-config](https://github.com/luggit/react-native-config) to expose config variables to your javascript code in React Native. You can store API keys 42 | and other sensitive information in a `.env` file: 43 | 44 | ``` 45 | API_URL=https://myapi.com 46 | GOOGLE_MAPS_API_KEY=abcdefgh 47 | ``` 48 | 49 | and access them from React Native like so: 50 | 51 | ``` 52 | import Secrets from 'react-native-config' 53 | 54 | Secrets.API_URL // 'https://myapi.com' 55 | Secrets.GOOGLE_MAPS_API_KEY // 'abcdefgh' 56 | ``` 57 | 58 | The `.env` file is ignored by git keeping those secrets out of your repo. 59 | 60 | -------------------------------------------------------------------------------- /Tests/Setup.js: -------------------------------------------------------------------------------- 1 | jest 2 | .mock('react-native-device-info', () => { 3 | return { isTablet: jest.fn(() => { return false }) } 4 | }) 5 | -------------------------------------------------------------------------------- /Tests/StoriesTest.js: -------------------------------------------------------------------------------- 1 | import initStoryshots from '@storybook/addon-storyshots' 2 | 3 | initStoryshots() 4 | -------------------------------------------------------------------------------- /android/app/BUCK: -------------------------------------------------------------------------------- 1 | # To learn about Buck see [Docs](https://buckbuild.com/). 2 | # To run your application with Buck: 3 | # - install Buck 4 | # - `npm start` - to start the packager 5 | # - `cd android` 6 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` 7 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck 8 | # - `buck install -r android/app` - compile, install and run application 9 | # 10 | 11 | lib_deps = [] 12 | 13 | for jarfile in glob(['libs/*.jar']): 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 | 21 | for aarfile in glob(['libs/*.aar']): 22 | name = 'aars__' + aarfile[aarfile.rindex('/') + 1: aarfile.rindex('.aar')] 23 | lib_deps.append(':' + name) 24 | android_prebuilt_aar( 25 | name = name, 26 | aar = aarfile, 27 | ) 28 | 29 | android_library( 30 | name = "all-libs", 31 | exported_deps = lib_deps, 32 | ) 33 | 34 | android_library( 35 | name = "app-code", 36 | srcs = glob([ 37 | "src/main/java/**/*.java", 38 | ]), 39 | deps = [ 40 | ":all-libs", 41 | ":build_config", 42 | ":res", 43 | ], 44 | ) 45 | 46 | android_build_config( 47 | name = "build_config", 48 | package = "com.reactfinlandapp", 49 | ) 50 | 51 | android_resource( 52 | name = "res", 53 | package = "com.reactfinlandapp", 54 | res = "src/main/res", 55 | ) 56 | 57 | android_binary( 58 | name = "app", 59 | keystore = "//android/keystores:debug", 60 | manifest = "src/main/AndroidManifest.xml", 61 | package_type = "debug", 62 | deps = [ 63 | ":app-code", 64 | ], 65 | ) 66 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.android.application" 2 | 3 | import com.android.build.OutputFile 4 | 5 | /** 6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets 7 | * and bundleReleaseJsAndAssets). 8 | * These basically call `react-native bundle` with the correct arguments during the Android build 9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the 10 | * bundle directly from the development server. Below you can see all the possible configurations 11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the 12 | * `apply from: "../../node_modules/react-native/react.gradle"` line. 13 | * 14 | * project.ext.react = [ 15 | * // the name of the generated asset file containing your JS bundle 16 | * bundleAssetName: "index.android.bundle", 17 | * 18 | * // the entry file for bundle generation 19 | * entryFile: "index.android.js", 20 | * 21 | * // whether to bundle JS and assets in debug mode 22 | * bundleInDebug: false, 23 | * 24 | * // whether to bundle JS and assets in release mode 25 | * bundleInRelease: true, 26 | * 27 | * // whether to bundle JS and assets in another build variant (if configured). 28 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 29 | * // The configuration property can be in the following formats 30 | * // 'bundleIn${productFlavor}${buildType}' 31 | * // 'bundleIn${buildType}' 32 | * // bundleInFreeDebug: true, 33 | * // bundleInPaidRelease: true, 34 | * // bundleInBeta: true, 35 | * 36 | * // whether to disable dev mode in custom build variants (by default only disabled in release) 37 | * // for example: to disable dev mode in the staging build type (if configured) 38 | * devDisabledInStaging: true, 39 | * // The configuration property can be in the following formats 40 | * // 'devDisabledIn${productFlavor}${buildType}' 41 | * // 'devDisabledIn${buildType}' 42 | * 43 | * // the root of your project, i.e. where "package.json" lives 44 | * root: "../../", 45 | * 46 | * // where to put the JS bundle asset in debug mode 47 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", 48 | * 49 | * // where to put the JS bundle asset in release mode 50 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release", 51 | * 52 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 53 | * // require('./image.png')), in debug mode 54 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", 55 | * 56 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 57 | * // require('./image.png')), in release mode 58 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", 59 | * 60 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means 61 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to 62 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle 63 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ 64 | * // for example, you might want to remove it from here. 65 | * inputExcludes: ["android/**", "ios/**"], 66 | * 67 | * // override which node gets called and with what additional arguments 68 | * nodeExecutableAndArgs: ["node"], 69 | * 70 | * // supply additional arguments to the packager 71 | * extraPackagerArgs: [] 72 | * ] 73 | */ 74 | 75 | project.ext.react = [ 76 | entryFile: "index.js" 77 | ] 78 | 79 | apply from: "../../node_modules/react-native/react.gradle" 80 | 81 | /** 82 | * Set this to true to create two separate APKs instead of one: 83 | * - An APK that only works on ARM devices 84 | * - An APK that only works on x86 devices 85 | * The advantage is the size of the APK is reduced by about 4MB. 86 | * Upload all the APKs to the Play Store and people will download 87 | * the correct one based on the CPU architecture of their device. 88 | */ 89 | def enableSeparateBuildPerCPUArchitecture = false 90 | 91 | /** 92 | * Run Proguard to shrink the Java bytecode in release builds. 93 | */ 94 | def enableProguardInReleaseBuilds = false 95 | 96 | android { 97 | compileSdkVersion rootProject.ext.compileSdkVersion 98 | buildToolsVersion rootProject.ext.buildToolsVersion 99 | 100 | defaultConfig { 101 | applicationId "com.reactfinlandapp" 102 | minSdkVersion rootProject.ext.minSdkVersion 103 | targetSdkVersion rootProject.ext.targetSdkVersion 104 | versionCode 21 105 | versionName "1.3.2" 106 | ndk { 107 | abiFilters "armeabi-v7a", "x86" 108 | } 109 | } 110 | splits { 111 | abi { 112 | reset() 113 | enable enableSeparateBuildPerCPUArchitecture 114 | universalApk false // If true, also generate a universal APK 115 | include "armeabi-v7a", "x86" 116 | } 117 | } 118 | buildTypes { 119 | release { 120 | minifyEnabled enableProguardInReleaseBuilds 121 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 122 | } 123 | } 124 | // applicationVariants are e.g. debug, release 125 | applicationVariants.all { variant -> 126 | variant.outputs.each { output -> 127 | // For each separate APK per architecture, set a unique version code as described here: 128 | // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits 129 | def versionCodes = ["armeabi-v7a":1, "x86":2] 130 | def abi = output.getFilter(OutputFile.ABI) 131 | if (abi != null) { // null for the universal-debug, universal-release variants 132 | output.versionCodeOverride = 133 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode 134 | } 135 | } 136 | } 137 | } 138 | 139 | dependencies { 140 | compile project(':react-native-vector-icons') 141 | compile project(':react-native-config') 142 | implementation fileTree(dir: "libs", include: ["*.jar"]) 143 | implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}" 144 | implementation "com.facebook.react:react-native:+" // From node_modules 145 | } 146 | 147 | // Run this once to be able to run the application with BUCK 148 | // puts all compile dependencies into folder libs for BUCK to use 149 | task copyDownloadableDepsToLibs(type: Copy) { 150 | from configurations.compile 151 | into 'libs' 152 | } 153 | -------------------------------------------------------------------------------- /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/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 13 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/AntDesign.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/AntDesign.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Entypo.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/Entypo.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/EvilIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/EvilIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Feather.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/Feather.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Finlandica-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/Finlandica-Bold.otf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Finlandica-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/Finlandica-Regular.otf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/FontAwesome.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/FontAwesome.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/FontAwesome5_Brands.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/FontAwesome5_Brands.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/FontAwesome5_Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/FontAwesome5_Regular.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/FontAwesome5_Solid.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/FontAwesome5_Solid.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Foundation.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/Foundation.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/Ionicons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/MaterialIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/MaterialIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Octicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/Octicons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/SimpleLineIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/SimpleLineIcons.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Zocial.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/assets/fonts/Zocial.ttf -------------------------------------------------------------------------------- /android/app/src/main/java/com/reactfinlandapp/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.reactfinlandapp; 2 | 3 | import com.facebook.react.ReactActivity; 4 | 5 | public class MainActivity extends ReactActivity { 6 | 7 | /** 8 | * Returns the name of the main component registered from JavaScript. 9 | * This is used to schedule rendering of the component. 10 | */ 11 | @Override 12 | protected String getMainComponentName() { 13 | return "ReactFinlandApp"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/reactfinlandapp/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.reactfinlandapp; 2 | 3 | import android.app.Application; 4 | 5 | import com.facebook.react.ReactApplication; 6 | import com.oblador.vectoricons.VectorIconsPackage; 7 | import com.lugg.ReactNativeConfig.ReactNativeConfigPackage; 8 | import com.facebook.react.ReactNativeHost; 9 | import com.facebook.react.ReactPackage; 10 | import com.facebook.react.shell.MainReactPackage; 11 | import com.facebook.soloader.SoLoader; 12 | 13 | import java.util.Arrays; 14 | import java.util.List; 15 | 16 | public class MainApplication extends Application implements ReactApplication { 17 | 18 | private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 19 | @Override 20 | public boolean getUseDeveloperSupport() { 21 | return BuildConfig.DEBUG; 22 | } 23 | 24 | @Override 25 | protected List getPackages() { 26 | return Arrays.asList( 27 | new MainReactPackage(), 28 | new VectorIconsPackage(), 29 | new ReactNativeConfigPackage() 30 | ); 31 | } 32 | 33 | @Override 34 | protected String getJSMainModuleName() { 35 | return "index"; 36 | } 37 | }; 38 | 39 | @Override 40 | public ReactNativeHost getReactNativeHost() { 41 | return mReactNativeHost; 42 | } 43 | 44 | @Override 45 | public void onCreate() { 46 | super.onCreate(); 47 | SoLoader.init(this, /* native exopackage */ false); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | React Finland 3 | 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /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 = "27.0.3" 6 | minSdkVersion = 16 7 | compileSdkVersion = 27 8 | targetSdkVersion = 26 9 | supportLibVersion = "27.1.1" 10 | } 11 | repositories { 12 | google() 13 | jcenter() 14 | } 15 | dependencies { 16 | classpath 'com.android.tools.build:gradle:3.1.4' 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.4' 38 | distributionUrl = distributionUrl.replace("bin", "all") 39 | } 40 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/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.4-all.zip 6 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'ReactFinlandApp' 2 | include ':react-native-vector-icons' 3 | project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') 4 | include ':react-native-config' 5 | project(':react-native-config').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-config/android') 6 | 7 | include ':app' 8 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ReactFinlandApp", 3 | "displayName": "React Finland" 4 | } -------------------------------------------------------------------------------- /assets/fonts/Finlandica-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/assets/fonts/Finlandica-Bold.otf -------------------------------------------------------------------------------- /assets/fonts/Finlandica-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/assets/fonts/Finlandica-Regular.otf -------------------------------------------------------------------------------- /ignite/ignite.json: -------------------------------------------------------------------------------- 1 | { 2 | "createdWith": "2.0.0", 3 | "examples": "classic", 4 | "navigation": "react-navigation", 5 | "askToOverride": true, 6 | "generators": { 7 | "component": "ignite-ir-boilerplate", 8 | "container": "ignite-ir-boilerplate", 9 | "listview": "ignite-ir-boilerplate", 10 | "list": "ignite-ir-boilerplate", 11 | "redux": "ignite-ir-boilerplate", 12 | "saga": "ignite-ir-boilerplate", 13 | "screen": "ignite-ir-boilerplate" 14 | } 15 | } -------------------------------------------------------------------------------- /ignite/plugins/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/ignite/plugins/.gitkeep -------------------------------------------------------------------------------- /index.android.js: -------------------------------------------------------------------------------- 1 | import './App/Config/ReactotronConfig' 2 | import { AppRegistry } from 'react-native' 3 | import App from './App/Containers/App' 4 | 5 | AppRegistry.registerComponent('ReactFinlandApp', () => App) 6 | -------------------------------------------------------------------------------- /index.ios.js: -------------------------------------------------------------------------------- 1 | import './App/Config/ReactotronConfig' 2 | import { AppRegistry } from 'react-native' 3 | import App from './App/Containers/App' 4 | 5 | AppRegistry.registerComponent('ReactFinlandApp', () => App) 6 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import './App/Config/ReactotronConfig' 2 | import { AppRegistry } from 'react-native' 3 | import App from './App/Containers/App' 4 | 5 | AppRegistry.registerComponent('ReactFinlandApp', () => App) 6 | -------------------------------------------------------------------------------- /ios/ReactFinlandApp-tvOS/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 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UIViewControllerBasedStatusBarAppearance 38 | 39 | NSLocationWhenInUseUsageDescription 40 | 41 | NSAppTransportSecurity 42 | 43 | 44 | NSExceptionDomains 45 | 46 | localhost 47 | 48 | NSExceptionAllowsInsecureHTTPLoads 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /ios/ReactFinlandApp-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 | -------------------------------------------------------------------------------- /ios/ReactFinlandApp.xcodeproj/xcshareddata/xcschemes/ReactFinlandApp-tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 61 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 92 | 94 | 100 | 101 | 102 | 103 | 104 | 105 | 111 | 113 | 119 | 120 | 121 | 122 | 124 | 125 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /ios/ReactFinlandApp.xcodeproj/xcshareddata/xcschemes/ReactFinlandApp.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 61 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 92 | 94 | 100 | 101 | 102 | 103 | 104 | 105 | 111 | 113 | 119 | 120 | 121 | 122 | 124 | 125 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /ios/ReactFinlandApp/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 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/ReactFinlandApp/AppDelegate.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 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 | #ifdef DEBUG 20 | jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; 21 | #else 22 | jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 23 | #endif 24 | 25 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 26 | moduleName:@"ReactFinlandApp" 27 | initialProperties:nil 28 | launchOptions:launchOptions]; 29 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 30 | 31 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 32 | UIViewController *rootViewController = [UIViewController new]; 33 | rootViewController.view = rootView; 34 | self.window.rootViewController = rootViewController; 35 | [self.window makeKeyAndVisible]; 36 | return YES; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 21 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/120-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/120-1.png -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "40.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "60.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "58.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "87.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "80.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "120.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "120-1.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "180.png", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "size" : "1024x1024", 53 | "idiom" : "ios-marketing", 54 | "filename" : "1024.png", 55 | "scale" : "1x" 56 | } 57 | ], 58 | "info" : { 59 | "version" : 1, 60 | "author" : "xcode" 61 | } 62 | } -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ios/ReactFinlandApp/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | React Finland 2019 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0.3 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 3 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSAllowsArbitraryLoads 30 | 31 | NSExceptionDomains 32 | 33 | localhost 34 | 35 | NSExceptionAllowsInsecureHTTPLoads 36 | 37 | 38 | 39 | 40 | NSLocationWhenInUseUsageDescription 41 | 42 | UIAppFonts 43 | 44 | Finlandica-Bold.otf 45 | Finlandica-Regular.otf 46 | Entypo.ttf 47 | EvilIcons.ttf 48 | FontAwesome.ttf 49 | Foundation.ttf 50 | Ionicons.ttf 51 | MaterialCommunityIcons.ttf 52 | MaterialIcons.ttf 53 | Octicons.ttf 54 | SimpleLineIcons.ttf 55 | Zocial.ttf 56 | AntDesign.ttf 57 | Feather.ttf 58 | FontAwesome5_Brands.ttf 59 | FontAwesome5_Regular.ttf 60 | FontAwesome5_Solid.ttf 61 | 62 | UILaunchStoryboardName 63 | LaunchScreen 64 | UIRequiredDeviceCapabilities 65 | 66 | armv7 67 | 68 | UISupportedInterfaceOrientations 69 | 70 | UIInterfaceOrientationPortrait 71 | UIInterfaceOrientationLandscapeLeft 72 | UIInterfaceOrientationLandscapeRight 73 | 74 | UIViewControllerBasedStatusBarAppearance 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /ios/ReactFinlandApp/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 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 | -------------------------------------------------------------------------------- /ios/ReactFinlandAppTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ios/ReactFinlandAppTests/ReactFinlandAppTests.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 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 | #import 10 | 11 | #import 12 | #import 13 | 14 | #define TIMEOUT_SECONDS 600 15 | #define TEXT_TO_LOOK_FOR @"Welcome to React Native!" 16 | 17 | @interface ReactFinlandAppTests : XCTestCase 18 | 19 | @end 20 | 21 | @implementation ReactFinlandAppTests 22 | 23 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test 24 | { 25 | if (test(view)) { 26 | return YES; 27 | } 28 | for (UIView *subview in [view subviews]) { 29 | if ([self findSubviewInView:subview matching:test]) { 30 | return YES; 31 | } 32 | } 33 | return NO; 34 | } 35 | 36 | - (void)testRendersWelcomeScreen 37 | { 38 | UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; 39 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; 40 | BOOL foundElement = NO; 41 | 42 | __block NSString *redboxError = nil; 43 | RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { 44 | if (level >= RCTLogLevelError) { 45 | redboxError = message; 46 | } 47 | }); 48 | 49 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { 50 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 51 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 52 | 53 | foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { 54 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { 55 | return YES; 56 | } 57 | return NO; 58 | }]; 59 | } 60 | 61 | RCTSetLogFunction(RCTDefaultLogFunction); 62 | 63 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); 64 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); 65 | } 66 | 67 | 68 | @end 69 | -------------------------------------------------------------------------------- /launch-assets/android/drawable-hdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-hdpi/icon.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-hdpi/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-hdpi/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-land-hdpi/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-land-hdpi/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-land-ldpi/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-land-ldpi/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-land-mdpi/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-land-mdpi/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-land-xhdpi/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-land-xhdpi/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-land-xxhdpi/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-land-xxhdpi/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-land-xxxhdpi/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-land-xxxhdpi/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-land/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-land/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-ldpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-ldpi/icon.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-ldpi/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-ldpi/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-mdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-mdpi/icon.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-mdpi/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-mdpi/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-xhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-xhdpi/icon.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-xhdpi/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-xhdpi/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-xxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-xxhdpi/icon.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-xxhdpi/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-xxhdpi/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-xxxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-xxxhdpi/icon.png -------------------------------------------------------------------------------- /launch-assets/android/drawable-xxxhdpi/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable-xxxhdpi/screen.png -------------------------------------------------------------------------------- /launch-assets/android/drawable/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable/icon.png -------------------------------------------------------------------------------- /launch-assets/android/drawable/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/android/drawable/screen.png -------------------------------------------------------------------------------- /launch-assets/iOS/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "iphone", 5 | "size": "20x20", 6 | "scale": "2x", 7 | "filename": "Icon-20x20@2x.png" 8 | }, 9 | { 10 | "idiom": "iphone", 11 | "size": "20x20", 12 | "scale": "3x", 13 | "filename": "Icon-20x20@3x.png" 14 | }, 15 | { 16 | "idiom": "iphone", 17 | "size": "29x29", 18 | "scale": "1x", 19 | "filename": "Icon-29x29@1x.png" 20 | }, 21 | { 22 | "idiom": "iphone", 23 | "size": "29x29", 24 | "scale": "2x", 25 | "filename": "Icon-29x29@2x.png" 26 | }, 27 | { 28 | "idiom": "iphone", 29 | "size": "40x40", 30 | "scale": "2x", 31 | "filename": "Icon-40x40@2x.png" 32 | }, 33 | { 34 | "idiom": "iphone", 35 | "size": "40x40", 36 | "scale": "3x", 37 | "filename": "Icon-40x40@3x.png" 38 | }, 39 | { 40 | "idiom": "iphone", 41 | "size": "60x60", 42 | "scale": "2x", 43 | "filename": "Icon-60x60@2x.png" 44 | }, 45 | { 46 | "idiom": "iphone", 47 | "size": "60x60", 48 | "scale": "3x", 49 | "filename": "Icon-60x60@3x.png" 50 | }, 51 | { 52 | "idiom": "iphone", 53 | "size": "1024x1024", 54 | "scale": "1x", 55 | "filename": "Icon-marketing-1024x1024.png" 56 | } 57 | ], 58 | "info": { 59 | "version": 1, 60 | "author": "apetools.webprofusion.com" 61 | } 62 | } -------------------------------------------------------------------------------- /launch-assets/iOS/AppIcon.appiconset/Icon-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/iOS/AppIcon.appiconset/Icon-20x20@2x.png -------------------------------------------------------------------------------- /launch-assets/iOS/AppIcon.appiconset/Icon-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/iOS/AppIcon.appiconset/Icon-20x20@3x.png -------------------------------------------------------------------------------- /launch-assets/iOS/AppIcon.appiconset/Icon-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/iOS/AppIcon.appiconset/Icon-29x29@1x.png -------------------------------------------------------------------------------- /launch-assets/iOS/AppIcon.appiconset/Icon-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/iOS/AppIcon.appiconset/Icon-29x29@2x.png -------------------------------------------------------------------------------- /launch-assets/iOS/AppIcon.appiconset/Icon-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/iOS/AppIcon.appiconset/Icon-40x40@2x.png -------------------------------------------------------------------------------- /launch-assets/iOS/AppIcon.appiconset/Icon-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/iOS/AppIcon.appiconset/Icon-40x40@3x.png -------------------------------------------------------------------------------- /launch-assets/iOS/AppIcon.appiconset/Icon-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/iOS/AppIcon.appiconset/Icon-60x60@2x.png -------------------------------------------------------------------------------- /launch-assets/iOS/AppIcon.appiconset/Icon-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/iOS/AppIcon.appiconset/Icon-60x60@3x.png -------------------------------------------------------------------------------- /launch-assets/iOS/AppIcon.appiconset/Icon-marketing-1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReactFinland/react-finland-app/c54cc72ed51829401682434a118cea8379672caf/launch-assets/iOS/AppIcon.appiconset/Icon-marketing-1024x1024.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-finland-app", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node node_modules/react-native/local-cli/cli.js start", 7 | "test": "jest", 8 | "clean": "rm -rf $TMPDIR/react-* && watchman watch-del-all && npm cache clean --force", 9 | "clean:android": "cd android/ && ./gradlew clean && cd .. && react-native run-android", 10 | "newclear": "rm -rf $TMPDIR/react-* && watchman watch-del-all && rm -rf ios/build && rm -rf node_modules/ && npm cache clean --force && npm i", 11 | "test:watch": "jest --watch", 12 | "updateSnapshot": "jest --updateSnapshot", 13 | "coverage": "jest --coverage && open coverage/lcov-report/index.html || xdg-open coverage/lcov-report/index.html", 14 | "android:build": "cd android && ./gradlew assembleRelease", 15 | "android:install": "cd android && ./gradlew assembleRelease && ./gradlew installRelease", 16 | "android:hockeyapp": "cd android && ./gradlew assembleRelease && puck -submit=auto app/build/outputs/apk/app-release.apk", 17 | "android:devices": "$ANDROID_HOME/platform-tools/adb devices", 18 | "android:logcat": "$ANDROID_HOME/platform-tools/adb logcat *:S ReactNative:V ReactNativeJS:V", 19 | "android:shake": "$ANDROID_HOME/platform-tools/adb devices | grep '\\t' | awk '{print $1}' | sed 's/\\s//g' | xargs -I {} $ANDROID_HOME/platform-tools/adb -s {} shell input keyevent 82", 20 | "storybook": "storybook start -p 7007", 21 | "lint": "standard --verbose | snazzy", 22 | "lintdiff": "git diff --name-only --cached --relative | grep '\\.js$' | xargs standard | snazzy", 23 | "fixcode": "standard --fix", 24 | "git-hook": "npm run lint -s && npm run test -s" 25 | }, 26 | "dependencies": { 27 | "apollo-boost": "^0.1.16", 28 | "apollo-cache-persist": "^0.1.1", 29 | "apollo-cache-redux": "0.1.0-alpha.7", 30 | "apollo-client-preset": "^1.0.5", 31 | "graphql": "^0.12.3", 32 | "graphql-tag": "^2.6.1", 33 | "lodash": "^4.17.2", 34 | "metro-react-native-babel-preset": "^0.51.1", 35 | "prop-types": "^15.5.10", 36 | "querystringify": "0.0.4", 37 | "ramda": "^0.24.1", 38 | "react": "^16.8.6", 39 | "react-apollo": "^2.2.4", 40 | "react-native": "^0.59.6", 41 | "react-native-animatable": "^1.2.4", 42 | "react-native-config": "^0.11.7", 43 | "react-native-drawer": "^2.3.0", 44 | "react-native-elements": "^1.1.0", 45 | "react-native-ratings": "^6.3.1", 46 | "react-native-simple-toast": "0.0.8", 47 | "react-native-vector-icons": "^6.3.0", 48 | "react-navigation": "1.0.0-beta.27", 49 | "react-redux": "^5.0.2", 50 | "redux": "^3.6.0", 51 | "redux-offline": "^2.0.0", 52 | "redux-persist": "^4.1.0", 53 | "redux-saga": "^0.15.6", 54 | "reduxsauce": "0.4.1", 55 | "seamless-immutable": "^7.1.4", 56 | "styled-components": "4.1.2" 57 | }, 58 | "devDependencies": { 59 | "@storybook/addon-storyshots": "^3.2.3", 60 | "@storybook/react-native": "^3.2.3", 61 | "babel-eslint": "7.1.1", 62 | "babel-jest": "21.0.2", 63 | "babel-plugin-ignite-ignore-reactotron": "^0.3.0", 64 | "babel-preset-es2015": "^6.18.0", 65 | "babel-preset-react-native": "^5.0.2", 66 | "enzyme": "^2.6.0", 67 | "husky": "^0.13.1", 68 | "ignite-animatable": "^1.0.0", 69 | "ignite-i18n": "^1.1.0", 70 | "ignite-ir-boilerplate": "^2.1.1", 71 | "ignite-standard": "^1.0.0", 72 | "ignite-vector-icons": "^1.1.0", 73 | "jest": "21.1.0", 74 | "react-addons-test-utils": "~15.4.1", 75 | "react-dom": "16.0.0-alpha.12", 76 | "react-test-renderer": "16.0.0-alpha.12", 77 | "reactotron-react-native": "^2.1.4", 78 | "reactotron-redux": "^1.11.1", 79 | "reactotron-redux-saga": "^1.11.1", 80 | "snazzy": "^7.0.0", 81 | "standard": "10.0.2" 82 | }, 83 | "jest": { 84 | "testMatch": [ 85 | "**/Tests/**/*.js", 86 | "**/?(*.)(spec|test).js?(x)" 87 | ], 88 | "testPathIgnorePatterns": [ 89 | "/node_modules/", 90 | "Tests/Setup.js" 91 | ], 92 | "setupFiles": [ 93 | "./Tests/Setup" 94 | ], 95 | "preset": "react-native" 96 | }, 97 | "config": {}, 98 | "standard": { 99 | "parser": "babel-eslint", 100 | "globals": [ 101 | "describe", 102 | "test", 103 | "jest", 104 | "expect", 105 | "fetch", 106 | "navigator", 107 | "__DEV__", 108 | "XMLHttpRequest", 109 | "FormData", 110 | "React$Element" 111 | ] 112 | }, 113 | "rnpm": { 114 | "assets": [ 115 | "./assets/fonts" 116 | ] 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /rn-cli.config.js: -------------------------------------------------------------------------------- 1 | const blacklist = require('metro-config/src/defaults/blacklist') 2 | module.exports = { 3 | getBlacklistRE () { 4 | return blacklist([/react-native\/local-cli\/core\/__fixtures__.*/]) 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /storybook/addons.js: -------------------------------------------------------------------------------- 1 | import '@storybook/addon-actions/register' 2 | import '@storybook/addon-links/register' 3 | -------------------------------------------------------------------------------- /storybook/index.android.js: -------------------------------------------------------------------------------- 1 | import StorybookUI from './storybook' 2 | 3 | export default StorybookUI 4 | -------------------------------------------------------------------------------- /storybook/index.ios.js: -------------------------------------------------------------------------------- 1 | import StorybookUI from './storybook' 2 | 3 | export default StorybookUI 4 | -------------------------------------------------------------------------------- /storybook/storybook.js: -------------------------------------------------------------------------------- 1 | import { AppRegistry } from 'react-native' 2 | import { getStorybookUI, configure } from '@storybook/react-native' 3 | 4 | // import stories 5 | configure(() => { 6 | require('../App/Components/Stories') 7 | }, module) 8 | 9 | // This assumes that storybook is running on the same host as your RN packager, 10 | // to set manually use, e.g. host: 'localhost' option 11 | const StorybookUI = getStorybookUI({ port: 7007, onDeviceUI: true }) 12 | AppRegistry.registerComponent('ReactFinlandApp', () => StorybookUI) 13 | export default StorybookUI 14 | --------------------------------------------------------------------------------