Commit 92434766 by JM Fantin

Merge branch 'acessoUsuario' into 'master'

Filtros de card (admin e votante) por UID

See merge request !43
2 parents aed61be7 c908b201
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
"devToolsPort": 19002, "devToolsPort": 19002,
"expoServerPort": 19000, "expoServerPort": 19000,
"packagerPort": 19001, "packagerPort": 19001,
"packagerPid": 8160, "packagerPid": 16236,
"expoServerNgrokUrl": "https://xz-g8k.evote.rn-evote.exp.direct", "expoServerNgrokUrl": null,
"packagerNgrokUrl": "https://packager.xz-g8k.evote.rn-evote.exp.direct", "packagerNgrokUrl": null,
"ngrokPid": 8220, "ngrokPid": null,
"webpackServerPort": null "webpackServerPort": null
} }
\ No newline at end of file
...@@ -14,6 +14,7 @@ import AndamentoVotos from './src/screens/AndamentoVotos'; ...@@ -14,6 +14,7 @@ import AndamentoVotos from './src/screens/AndamentoVotos';
import Votacao from './src/screens/Votacao'; import Votacao from './src/screens/Votacao';
import Votar from './src/screens/Votar'; import Votar from './src/screens/Votar';
import Login from './src/screens/Login'; import Login from './src/screens/Login';
import { app } from 'firebase';
const AppNavigator = createStackNavigator( const AppNavigator = createStackNavigator(
{ {
......
...@@ -6829,6 +6829,10 @@ ...@@ -6829,6 +6829,10 @@
"prop-types": "^15.5.10" "prop-types": "^15.5.10"
} }
}, },
"react-native-maps": {
"version": "github:expo/react-native-maps#e6f98ff7272e5d0a7fe974a41f28593af2d77bb2",
"from": "github:expo/react-native-maps#v0.22.1-exp.0"
},
"react-native-material-textfield": { "react-native-material-textfield": {
"version": "0.12.0", "version": "0.12.0",
"resolved": "https://registry.npmjs.org/react-native-material-textfield/-/react-native-material-textfield-0.12.0.tgz", "resolved": "https://registry.npmjs.org/react-native-material-textfield/-/react-native-material-textfield-0.12.0.tgz",
......
...@@ -27,16 +27,7 @@ export default class CardSalaVotacao extends Component { ...@@ -27,16 +27,7 @@ export default class CardSalaVotacao extends Component {
} }
}; };
calculaDescricaoSala = (data, hora) => {
moment.updateLocale('pt-br');
let salaMoment = moment(`${data} ${hora}`, 'DD/MM/YYYY HH:mm')
return salaMoment.fromNow();
// return "daqui a pouco";
}
render() { render() {
const { status, mensagem, titulo, onPress } = this.props; const { status, mensagem, titulo, onPress } = this.props;
...@@ -56,7 +47,7 @@ export default class CardSalaVotacao extends Component { ...@@ -56,7 +47,7 @@ export default class CardSalaVotacao extends Component {
{titulo} {titulo}
</Text> </Text>
<Text style={styles.subtitulo} numberOfLines={1} ellipsizeMode='tail'> <Text style={styles.subtitulo} numberOfLines={1} ellipsizeMode='tail'>
{this.calculaDescricaoSala('23/05/2019', '19:00')} {mensagem}
</Text> </Text>
</View> </View>
<Icon style={styles.icon} <Icon style={styles.icon}
......
import React, { Component } from 'react'; import React, { Component } from 'react';
import { View } from 'react-native'; import { View, ScrollView, Dimensions, Text, FlatList } from 'react-native';
import { db } from '../config';
let salasRef = db.ref('salas/');
import BotaoNovaSala from '../components/BotaoNovaSala';
import styles from '../styles/estilos'; import styles from '../styles/estilos';
import CardSalaVotacao from '../components/CardSalaVotacao';
import SemSalas from '../containers/SemSalas'; import SemSalas from '../containers/SemSalas';
import Barra from '../components/Barra' import CardSalaVotacao from '../components/CardSalaVotacao';
import Barra from '../components/Barra';
import BotaoAlternativa from '../components/BotaoAlternativa';
import moment from 'moment';
moment.defineLocale('pt-br', {
months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),
weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),
weekdaysParseExact : true,
longDateFormat : {
LT : 'HH:mm',
LTS : 'HH:mm:ss',
L : 'DD/MM/YYYY',
LL : 'D [de] MMMM [de] YYYY',
LLL : 'D [de] MMMM [de] YYYY [às] HH:mm',
LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'
},
calendar : {
sameDay: '[Hoje às] LT',
nextDay: '[Amanhã às] LT',
nextWeek: 'dddd [às] LT',
lastDay: '[Ontem às] LT',
lastWeek: function () {
return (this.day() === 0 || this.day() === 6) ?
'[Último] dddd [às] LT' : // Saturday + Sunday
'[Última] dddd [às] LT'; // Monday - Friday
},
sameElse: 'L'
},
relativeTime : {
future : 'em %s',
past : 'há %s',
s : 'poucos segundos',
ss : '%d segundos',
m : 'um minuto',
mm : '%d minutos',
h : 'uma hora',
hh : '%d horas',
d : 'um dia',
dd : '%d dias',
M : 'um mês',
MM : '%d meses',
y : 'um ano',
yy : '%d anos'
},
dayOfMonthOrdinalParse: /\d{1,2}º/,
ordinal : '%dº'
});
class Historico extends Component { class Historico extends Component {
constructor(props) { constructor(props) {
...@@ -16,36 +68,84 @@ class Historico extends Component { ...@@ -16,36 +68,84 @@ class Historico extends Component {
title: 'Histórico de Votações', title: 'Histórico de Votações',
}; };
handleVisualizar = (titulo) => { handleVisualizar = (item) => {
if (titulo) if (item)
this.props.navigation.navigate('Andamento', { 'titulo': titulo }); this.props.navigation.navigate('Votacao', { 'sala': item });
else else
this.props.navigation.navigate('Andamento', { 'titulo': 'Não disponível' }); this.props.navigation.navigate('Votacao', { 'sala': 'Não disponível' });
}
componentWillMount() {
salasRef.orderByChild("uid").on('value', snapshot => {
let salas = snapshot.val();
if (salas != null) {
salas = Object.values(salas);
this.setState(() => ({
salas
}))
}
});
}
getStatus = (dataFinal, dataInicial, horaFinal, horaInicial, informacaoExtra) => {
// fazer cálculo para retornar se está em andamento, encerrada ou se vai iniciar;
let firstMoment = moment(`${dataInicial} ${horaInicial}`, 'DD/MM/YYYY HH:mm');
let finalMoment = moment(`${dataFinal} ${horaFinal}`, 'DD/MM/YYYY HH:mm');
let nowMoment = moment();
if(firstMoment.diff(nowMoment)>0){
return informacaoExtra? `Disponível ${firstMoment.fromNow()}` : 'agendada';
}
if(finalMoment.diff(nowMoment)>=0){
return informacaoExtra? `Encerra ${finalMoment.fromNow()}` : 'andamento';
}
//console.log('enc');
return informacaoExtra? finalMoment.format('DD/MM/YYYY HH:mm') : 'encerrada';
} }
render() { render() {
const { salas, alternativas, selected } = this.state;
const { height } = Dimensions.get('screen');
return ( return (
<View style={styles.container}> <View style={[styles.container, { height: height }]}>
<View> <ScrollView style={{ maxHeight: height - 160, marginBottom: 5 }}>
<CardSalaVotacao <View>
key={1} {
onPress = {() => this.handleVisualizar('Assembleia 1')} salas.length > 0 ?
status='encerrada' salas.map((item, index) =>
mensagem='Votação do Sicredi' (this.getStatus(item.dataFinal,
titulo='Assembleia 1' item.dataInicial, item.horaFinal,
/> item.horaInicial, false))=='encerrada'?
<CardSalaVotacao <CardSalaVotacao
key={2} key={index}
onPress = {() => this.handleVisualizar('Assembleia 2')} onPress={() => this.handleVisualizar(item)}
status='encerrada' status={this.getStatus(item.dataFinal,
mensagem='Votação do Sicredi - centro' item.dataInicial, item.horaFinal,
titulo='Assembleia 2' item.horaInicial)}
/> mensagem={this.getStatus(item.dataFinal,
</View> item.dataInicial, item.horaFinal,
item.horaInicial, true)}
<Barra titulo={item.titulo}
index = {true} />:
onPress={() => this.props.navigation.navigate('Inicio')} /> null
)
:
<SemSalas
texto="Você não participou de votações prévias."
/>
}
</View>
</ScrollView>
<Barra
index={true}
onPress={() => this.props.navigation.navigate('Inicio')}
/>
</View> </View>
); );
} }
......
import React, { Component } from 'react'; import React, { Component } from 'react';
import { View, ScrollView, Dimensions, Text, FlatList } from 'react-native'; import { View, ScrollView, Dimensions, Text, FlatList, AsyncStorage } from 'react-native';
import { db } from '../config'; import { db } from '../config';
let salasRef = db.ref('salas/'); let salasRef = db.ref('salas/');
import BotaoNovaSala from '../components/BotaoNovaSala'; import BotaoNovaSala from '../components/BotaoNovaSala';
...@@ -9,136 +9,178 @@ import CardSalaVotacao from '../components/CardSalaVotacao'; ...@@ -9,136 +9,178 @@ import CardSalaVotacao from '../components/CardSalaVotacao';
import Barra from '../components/Barra'; import Barra from '../components/Barra';
import BotaoAlternativa from '../components/BotaoAlternativa'; import BotaoAlternativa from '../components/BotaoAlternativa';
import moment from 'moment'; import moment from 'moment';
import AuthService from '../shared/AuthService';
moment.defineLocale('pt-br', { moment.defineLocale('pt-br', {
months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), months: 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), monthsShort: 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), weekdays: 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),
weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),
weekdaysParseExact : true, weekdaysParseExact: true,
longDateFormat : { longDateFormat: {
LT : 'HH:mm', LT: 'HH:mm',
LTS : 'HH:mm:ss', LTS: 'HH:mm:ss',
L : 'DD/MM/YYYY', L: 'DD/MM/YYYY',
LL : 'D [de] MMMM [de] YYYY', LL: 'D [de] MMMM [de] YYYY',
LLL : 'D [de] MMMM [de] YYYY [às] HH:mm', LLL: 'D [de] MMMM [de] YYYY [às] HH:mm',
LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm' LLLL: 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'
}, },
calendar : { calendar: {
sameDay: '[Hoje às] LT', sameDay: '[Hoje às] LT',
nextDay: '[Amanhã às] LT', nextDay: '[Amanhã às] LT',
nextWeek: 'dddd [às] LT', nextWeek: 'dddd [às] LT',
lastDay: '[Ontem às] LT', lastDay: '[Ontem às] LT',
lastWeek: function () { lastWeek: function () {
return (this.day() === 0 || this.day() === 6) ? return (this.day() === 0 || this.day() === 6) ?
'[Último] dddd [às] LT' : // Saturday + Sunday '[Último] dddd [às] LT' : // Saturday + Sunday
'[Última] dddd [às] LT'; // Monday - Friday '[Última] dddd [às] LT'; // Monday - Friday
}, },
sameElse: 'L' sameElse: 'L'
}, },
relativeTime : { relativeTime: {
future : 'em %s', future: 'em %s',
past : 'há %s', past: 'há %s',
s : 'poucos segundos', s: 'poucos segundos',
ss : '%d segundos', ss: '%d segundos',
m : 'um minuto', m: 'um minuto',
mm : '%d minutos', mm: '%d minutos',
h : 'uma hora', h: 'uma hora',
hh : '%d horas', hh: '%d horas',
d : 'um dia', d: 'um dia',
dd : '%d dias', dd: '%d dias',
M : 'um mês', M: 'um mês',
MM : '%d meses', MM: '%d meses',
y : 'um ano', y: 'um ano',
yy : '%d anos' yy: '%d anos'
}, },
dayOfMonthOrdinalParse: /\d{1,2}º/, dayOfMonthOrdinalParse: /\d{1,2}º/,
ordinal : '%dº' ordinal: '%dº'
}); });
export default class Inicio extends Component { export default class Inicio extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.state = { this.state = {
salas: [], salas: [],
alternativas: ['#00E576', 'BALALBLABLALBALLABLLBALALBLABLALBALLABLLBALALBLABLALBALLABLLBALALBLABLALBALLABLL', 'HAUHDASHDIASHDOA'], souAdm: false
selected: null
} }
} }
static navigationOptions = { static navigationOptions = {
title: 'Votações disponíveis', title: 'Votações disponíveis',
}; };
componentWillMount() { componentWillMount() {
salasRef.orderByChild("uid").on('value', snapshot => { salasRef.orderByChild("uid").on('value', snapshot => {
let salas = snapshot.val(); let salas = snapshot.val();
AsyncStorage.getItem('@UID').then(uid => {
if (salas != null) { if (salas != null) {
salas = Object.values(salas); salas = Object.values(salas);
this.setState(() => ({ salas = salas.filter(sala => {
salas if(sala.adm_uid === uid){
})) return true;
} }
if(sala.votantes){
return [...sala.votantes].filter(v => v.uid === uid).length;
}
});
this.setState(() => ({
salas, uid
}))
}
},
error => console.log('EEERROOOOU', error));
}); });
} }
getStatus = (dataFinal, dataInicial, horaFinal, horaInicial) => { getStatus = (dataFinal, dataInicial, horaFinal, horaInicial, informacaoExtra) => {
// fazer cálculo para retornar se está em andamento, encerrada ou se vai iniciar; // fazer cálculo para retornar se está em andamento, encerrada ou se vai iniciar;
this.testFunc();
let firstMoment = moment(`${dataInicial} ${horaInicial}`, 'DD/MM/YYYY HH:mm'); let firstMoment = moment(`${dataInicial} ${horaInicial}`, 'DD/MM/YYYY HH:mm');
let finalMoment = moment(`${dataFinal} ${horaFinal}`, 'DD/MM/YYYY HH:mm'); let finalMoment = moment(`${dataFinal} ${horaFinal}`, 'DD/MM/YYYY HH:mm');
let nowMoment = moment(); let nowMoment = moment();
if (firstMoment.diff(nowMoment) > 0) {
if(firstMoment.diff(nowMoment)>0){ return informacaoExtra ? `Disponível ${firstMoment.fromNow()}` : 'agendada';
//console.log( 'ag');
return 'agendada';
} }
if(finalMoment.diff(nowMoment)>=0){ if (finalMoment.diff(nowMoment) >= 0) {
//console.log( 'andam'); return informacaoExtra ? `Encerra ${finalMoment.fromNow()}` : 'andamento';
return 'andamento'
} }
//console.log('enc'); //console.log('enc');
return 'encerrada'; return informacaoExtra ? finalMoment.format('DD/MM/YYYY HH:mm') : 'encerrada';
} }
handleVisualizar = (item) => { handleVisualizar = (item) => {
if (item) const { uid } = this.state
if (item){
if(uid && item.adm_uid === uid){
return this.props.navigation.navigate('Andamento', { 'sala': item });
}
this.props.navigation.navigate('Votacao', { 'sala': item }); this.props.navigation.navigate('Votacao', { 'sala': item });
else } else {
this.props.navigation.navigate('Votacao', { 'sala': 'Não disponível' }); this.props.navigation.navigate('Votacao', { 'sala': 'Não disponível' });
}
} }
handleSelect = selected => { handleSelect = selected => {
this.setState({ selected }); this.setState({ selected });
} }
testFunc = async () => {
// let res = await AsyncStorage.getItem('@UID');
}
getSalas = async () => {
}
getMinhasSalas = async salas => {
const uid = await AsyncStorage.get('@UID');
consol.log(uid)
return salas;
}
getDisponiveis = salas => {
return salas.map((item, index) => (
this.getStatus(item.dataFinal, item.dataInicial, item.horaFinal, item.horaInicial, false)
) != 'encerrada'
? <CardSalaVotacao
key={index}
onPress={() => this.handleVisualizar(item)}
status={this.getStatus(item.dataFinal,
item.dataInicial, item.horaFinal,
item.horaInicial)}
mensagem={this.getStatus(item.dataFinal,
item.dataInicial, item.horaFinal,
item.horaInicial, true)}
titulo={item.titulo}
/>
: null
)
}
render() { render() {
const { salas, alternativas, selected } = this.state; const { salas, alternativas, selected } = this.state;
const { height } = Dimensions.get('screen'); const { height } = Dimensions.get('screen');
// let x = await this.getMinhasSalas(salas);
return ( return (
<View style={[styles.container, { height: height }]}> <View style={[styles.container, { height: height }]}>
<ScrollView style={{ maxHeight: height - 240, marginBottom: 5 }}> <ScrollView style={{ maxHeight: height - 240, marginBottom: 5 }}>
<View> <View>
{ {
salas.length > 0 ? salas.length > 0
salas.map((item, index) => ? this.getDisponiveis(salas)
<CardSalaVotacao : <SemSalas texto={"No momento você não possui salas de votação disponíveis!"} />
key={index}
onPress={() => this.handleVisualizar(item)}
status={this.getStatus(item.dataFinal,
item.dataInicial, item.horaFinal,
item.horaInicial)}
mensagem={item.descricao}
titulo={item.titulo}
/>
)
:
<SemSalas
texto="No momento você não possui salas de votação disponíveis!"
/>
} }
</View> </View>
...@@ -155,4 +197,4 @@ export default class Inicio extends Component { ...@@ -155,4 +197,4 @@ export default class Inicio extends Component {
</View> </View>
); );
} }
} }
\ No newline at end of file
import React, { Component } from 'react'; import React, { Component } from 'react';
import { View, Image, TextInput, TouchableOpacity,Text, StyleSheet } from 'react-native'; import { View, Image, TextInput, TouchableOpacity,Text, StyleSheet, AsyncStorage } from 'react-native';
import { auth } from '../config'; import { auth } from '../config';
import InputEmail from '../components/InputEmail'; import InputEmail from '../components/InputEmail';
import InputSenha from '../components/InputSenha'; import InputSenha from '../components/InputSenha';
import styles from '../styles/estilos'; import styles from '../styles/estilos';
import AuthService from '../shared/AuthService';
export default class Login extends Component { export default class Login extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.state = { this.state = {
salas: {}, salas: {},
email: '', email: 'dev@evote.com',
senha: '', senha: '123456',
errorMessage:'' errorMessage:''
} }
} }
...@@ -20,14 +21,28 @@ export default class Login extends Component { ...@@ -20,14 +21,28 @@ export default class Login extends Component {
const { email, senha } = this.state const { email, senha } = this.state
auth auth
.signInWithEmailAndPassword(email, senha) .signInWithEmailAndPassword(email, senha)
.then((data) => this.props.navigation.navigate('Inicio')) .then((data) => {
.catch(error => this.setState({ errorMessage: 'E-mail ou senha incorretos.' })) console.log(JSON.stringify(data));
// AuthService.setUID(data.user.uid).then(
AsyncStorage.setItem('@UID', data.user.uid).then(
() => this.props.navigation.navigate('Inicio')
)
//)
})
.catch(error => {
console.log(error);
this.setState({ errorMessage: 'E-mail ou senha incorretos.' })
})
} }
static navigationOptions = { static navigationOptions = {
title: 'Bem-vind@ ao eVote!', title: 'Bem-vind@ ao eVote!',
}; };
static getUID = () => {
return AsyncStorage.getItem()
}
render(){ render(){
return( return(
<View style={styles.container}> <View style={styles.container}>
...@@ -39,15 +54,16 @@ export default class Login extends Component { ...@@ -39,15 +54,16 @@ export default class Login extends Component {
autoCorrect={false} autoCorrect={false}
keyboardType='email-address' keyboardType='email-address'
returnKeyType="next" returnKeyType="next"
label={'login'}
onChangeText={email => this.setState({ email })} onChangeText={email => this.setState({ email })}
value={this.state.email} value={this.state.email}
placeholder='E-mail' /> placeholder='E-mail' />
<InputSenha <InputSenha
autoCorrect={false} autoCorrect={false}
returnKeyType="go" returnKeyType="go"
ref={(input)=> this.passwordInput = input}
placeholder='Senha' placeholder='Senha'
label={'senha'}
onChangeText={senha => this.setState({ senha })} onChangeText={senha => this.setState({ senha })}
value={this.state.senha}/> value={this.state.senha}/>
......
import React, { Component } from 'react'; import React, { Component } from 'react';
import { View, Text, ScrollView } from 'react-native'; import { View, Text, ScrollView, AsyncStorage } from 'react-native';
import Aviso from '../components/Aviso'; import Aviso from '../components/Aviso';
import BotaoAnterior from '../components/BotaoAnterior'; import BotaoAnterior from '../components/BotaoAnterior';
import BotaoProximo from '../components/BotaoProximo'; import BotaoProximo from '../components/BotaoProximo';
...@@ -40,6 +40,13 @@ export default class Sala extends Component { ...@@ -40,6 +40,13 @@ export default class Sala extends Component {
headerLeft: null headerLeft: null
}; };
componentWillMount(){
AsyncStorage.getItem('@UID').then(uid => {
this.setState({sala: {...this.state.sala, adm_uid: uid}});
},
error => console.log('EEERROOOOU', error));
}
horaInvalida = (hF,hI) => { horaInvalida = (hF,hI) => {
const { dataFinal, dataInicial } = this.state.sala; const { dataFinal, dataInicial } = this.state.sala;
if(dataFinal == dataInicial) { if(dataFinal == dataInicial) {
......
import { AsyncStorage } from "react-native";
export class AuthService {
static setUID(uid) {
return AsyncStorage.setItem('@UID', uid);
}
static getUID() {
return AsyncStorage.getItem('@UID');
}
}
// export { AuthService }
\ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!