Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 24 additions & 11 deletions MobileApp/src/components/app-navigator.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,29 @@
import {createStackNavigator} from 'react-navigation'
import {
createStackNavigator,
createBottomTabNavigator
} from 'react-navigation'
import AuthScreen from './screens/auth'
import EventListScreen from './screens/event-list'
import EventScreen from './screens/event'
import PeopleListScreen from './screens/people-list'

const TabNavigator = createBottomTabNavigator({
eventList: {
screen: EventListScreen
},
peopletList: {
screen: PeopleListScreen
}
})

export default createStackNavigator({
auth: {
screen: AuthScreen
},
eventList: {
screen: EventListScreen
},
event: {
screen: EventScreen
}
})
auth: {
screen: AuthScreen
},
eventList: {
screen: TabNavigator
},
event: {
screen: EventScreen
}
})
10 changes: 10 additions & 0 deletions MobileApp/src/components/common/loader.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import React from 'react'
import { ActivityIndicator, View } from 'react-native'

Loader = () => (
<View>
<ActivityIndicator />
</View>
)

export default Loader
44 changes: 44 additions & 0 deletions MobileApp/src/components/people/people-list.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import React, { Component } from 'react'
import { Text, StyleSheet, SectionList } from 'react-native'
import PersonCard from './person-card'
import groupBy from 'lodash/groupBy'

class PeopleList extends Component {
render() {
const grouped = groupBy(this.props.people, (person) =>
person.firstName.charAt(0)
)
const sections = Object.entries(grouped).map(([letter, list]) => ({
title: letter,
data: list.map((person) => ({ key: person.uid, person }))
}))
return (
<SectionList
sections={sections}
renderSectionHeader={({ section }) => (
<Text style={styles.header}>{section.title}</Text>
)}
renderItem={({ item }) => (
<PersonCard person={item.person} key={item.key} />
)}
/>
)
}
}

const styles = StyleSheet.create({
header: {
backgroundColor: '#F0F0F0',
height: 40,
lineHeight: 40,
marginBottom: 5,
shadowOffset: {
height: 2,
width: 0
},
shadowOpacity: 0.3,
elevation: 3
}
})

export default PeopleList
20 changes: 20 additions & 0 deletions MobileApp/src/components/people/person-card.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import React, { Component } from 'react'
import { Text } from 'react-native'
import Card from '../common/card'

class PeopleCard extends Component {
render() {
const {
person: { firstName, lastName }
} = this.props
return (
<Card>
<Text>
{firstName} {lastName}
</Text>
</Card>
)
}
}

export default PeopleCard
27 changes: 19 additions & 8 deletions MobileApp/src/components/screens/event-list.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,29 @@
import React, { Component } from 'react'
import {View, StyleSheet} from 'react-native'
import { observer, inject } from 'mobx-react'
import { StyleSheet } from 'react-native'
import EventList from '../events/event-list'
import Loader from '../common/loader'

@inject('events')
@observer
class EventListScreen extends Component {
static propTypes = {
static propTypes = {}

};
componentDidMount() {
if (!this.props.events.loading && !this.props.events.loaded) {
this.props.events.fetchAll()
}
}

render() {
return <EventList events = {[]}/>
render() {
if (this.props.events.loading) {
return <Loader />
}

return <EventList events={this.props.events.entities} />
}
}

const styles = StyleSheet.create({
})
const styles = StyleSheet.create({})

export default EventListScreen
export default EventListScreen
24 changes: 24 additions & 0 deletions MobileApp/src/components/screens/people-list.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import React, { Component } from 'react'
import { observer, inject } from 'mobx-react'
import PeopleList from '../people/people-list'
import Loader from '../common/loader'

@inject('people')
@observer
class PeopleListScreen extends Component {
componentDidMount() {
if (!this.props.people.loading && !this.props.people.loaded) {
this.props.people.fetchAll()
}
}

render() {
if (this.props.people.loading) {
return <Loader />
}

return <PeopleList people={this.props.people.entities} />
}
}

export default PeopleListScreen
25 changes: 25 additions & 0 deletions MobileApp/src/stores/events.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { observable, action } from 'mobx'
import firebase from 'firebase/app'
import { fbToEntities } from './utils'

export default class EventsStore {
@observable loading = false
@observable loaded = false
@observable entities = []

fetchAll = action(() => {
this.loading = true

firebase
.database()
.ref('events')
.once(
'value',
action((data) => {
this.loading = false
this.entities = fbToEntities(data.val())
this.loaded = true
})
)
})
}
19 changes: 13 additions & 6 deletions MobileApp/src/stores/index.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
import '../config'

import UserStore from './user'
import EventsStore from './events'
import PeopleStore from './people'
import NavigationStore from './navigation'

export const navigationStore = new NavigationStore
export const userStore = new UserStore(navigationStore)
class Stores {
constructor() {
this.navigation = new NavigationStore(this)
this.user = new UserStore(this)
this.events = new EventsStore(this)
this.people = new PeopleStore(this)
}
}

export default {
user: userStore,
navigation: navigationStore
}
const stores = new Stores()

export default stores
25 changes: 25 additions & 0 deletions MobileApp/src/stores/people.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { observable, action } from 'mobx'
import firebase from 'firebase/app'
import { fbToEntities } from './utils'

export default class PeopleStore {
@observable loading = false
@observable loaded = false
@observable entities = []

fetchAll = action(() => {
this.loading = true

firebase
.database()
.ref('people')
.once(
'value',
action((data) => {
this.loading = false
this.entities = fbToEntities(data.val())
this.loaded = true
})
)
})
}
49 changes: 26 additions & 23 deletions MobileApp/src/stores/user.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,33 @@
import {observable, computed, action} from 'mobx'
import { observable, computed, action } from 'mobx'
import firebase from 'firebase/app'

export default class UserStore {
constructor(navigationStore) {
this.navigationStore = navigationStore
}
constructor(stores) {
this.navigationStore = stores.navigation
}

@observable email = ''
@observable password = ''
@observable user = null
@observable email = ''
@observable password = ''
@observable user = null

@computed get isValidPassword() {
return this.password.length >= 8
}
@computed
get isValidPassword() {
return this.password.length >= 8
}

@action setEmail = (email) => this.email = email
@action setPassword = (password) => this.password = password
@action setEmail = (email) => (this.email = email)
@action setPassword = (password) => (this.password = password)

signIn = () => {
firebase.auth().signInWithEmailAndPassword(this.email, this.password)
.then(user => {
this.user = user
console.log('---', 123)
this.navigationStore.navigate('eventList')
})
.catch(error => console.error(error))
this.user = {}
}
}
signIn = () => {
firebase
.auth()
.signInWithEmailAndPassword(this.email, this.password)
.then((user) => {
this.user = user
console.log('---', 123)
this.navigationStore.navigate('eventList')
})
.catch((error) => console.error(error))
this.user = {}
}
}
2 changes: 2 additions & 0 deletions MobileApp/src/stores/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export const fbToEntities = (data) =>
Object.entries(data).map(([uid, entity]) => ({ uid, ...entity }))