Commit 5cf2ea37 by JM Fantin

Merge branch 'dev-sprint4' into 'master'

Entrega final - dev sprint 4

See merge request !52
2 parents c847f1af 67c556d1
{
"devToolsPort": 19002,
"expoServerPort": 19000,
"packagerPort": 19001,
"packagerPid": 8160,
"expoServerNgrokUrl": "https://xz-g8k.evote.rn-evote.exp.direct",
"packagerNgrokUrl": "https://packager.xz-g8k.evote.rn-evote.exp.direct",
"ngrokPid": 8220,
"webpackServerPort": null
"expoServerPort": null,
"packagerPort": null,
"packagerPid": null,
"expoServerNgrokUrl": null,
"packagerNgrokUrl": null,
"ngrokPid": null
}
\ No newline at end of file
......@@ -3,5 +3,5 @@
"lanType": "ip",
"dev": true,
"minify": false,
"urlRandomness": "xz-g8k"
"urlRandomness": "b3-sgx"
}
\ No newline at end of file
......@@ -14,6 +14,10 @@ import AndamentoVotos from './src/screens/AndamentoVotos';
import Votacao from './src/screens/Votacao';
import Votar from './src/screens/Votar';
import Login from './src/screens/Login';
import TelaCadastro from './src/screens/TelaCadastro';
import { app } from 'firebase';
import moment from 'moment';
const AppNavigator = createStackNavigator(
{
......@@ -30,7 +34,8 @@ const AppNavigator = createStackNavigator(
AndamentoVotos,
Votacao,
VisualizarQuestao,
Votar
Votar,
TelaCadastro
},
{
initialRouteName: 'Login',
......@@ -59,4 +64,51 @@ export default class App extends Component {
<AppContainer />
)
}
}
\ No newline at end of file
}
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º'
});
\ No newline at end of file

47.6 KB | W: | H:

40.5 KB | W: | H:

assets/splash.png
assets/splash.png
assets/splash.png
assets/splash.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -3180,7 +3180,6 @@
"qs": "^6.5.0",
"react-native-branch": "2.2.5",
"react-native-gesture-handler": "1.0.9",
"react-native-maps": "github:expo/react-native-maps#e6f98ff7272e5d0a7fe974a41f28593af2d77bb2",
"react-native-reanimated": "1.0.0-alpha.10",
"react-native-screens": "1.0.0-alpha.15",
"react-native-svg": "8.0.8",
......@@ -3190,6 +3189,10 @@
"whatwg-fetch": "^2.0.4"
},
"dependencies": {
"react-native-maps": {
"version": "github:expo/react-native-maps#e6f98ff7272e5d0a7fe974a41f28593af2d77bb2",
"from": "github:expo/react-native-maps#e6f98ff7272e5d0a7fe974a41f28593af2d77bb2"
},
"react-native-screens": {
"version": "1.0.0-alpha.15",
"resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-1.0.0-alpha.15.tgz",
......@@ -3759,7 +3762,8 @@
},
"ansi-regex": {
"version": "2.1.1",
"bundled": true
"bundled": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
......@@ -3777,11 +3781,13 @@
},
"balanced-match": {
"version": "1.0.0",
"bundled": true
"bundled": true,
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
......@@ -3794,15 +3800,18 @@
},
"code-point-at": {
"version": "1.1.0",
"bundled": true
"bundled": true,
"optional": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true
"bundled": true,
"optional": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true
"bundled": true,
"optional": true
},
"core-util-is": {
"version": "1.0.2",
......@@ -3905,7 +3914,8 @@
},
"inherits": {
"version": "2.0.3",
"bundled": true
"bundled": true,
"optional": true
},
"ini": {
"version": "1.3.5",
......@@ -3915,6 +3925,7 @@
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
......@@ -3927,17 +3938,20 @@
"minimatch": {
"version": "3.0.4",
"bundled": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
"bundled": true
"bundled": true,
"optional": true
},
"minipass": {
"version": "2.3.5",
"bundled": true,
"optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
......@@ -3954,6 +3968,7 @@
"mkdirp": {
"version": "0.5.1",
"bundled": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
......@@ -4026,7 +4041,8 @@
},
"number-is-nan": {
"version": "1.0.1",
"bundled": true
"bundled": true,
"optional": true
},
"object-assign": {
"version": "4.1.1",
......@@ -4036,6 +4052,7 @@
"once": {
"version": "1.4.0",
"bundled": true,
"optional": true,
"requires": {
"wrappy": "1"
}
......@@ -4111,7 +4128,8 @@
},
"safe-buffer": {
"version": "5.1.2",
"bundled": true
"bundled": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
......@@ -4141,6 +4159,7 @@
"string-width": {
"version": "1.0.2",
"bundled": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
......@@ -4158,6 +4177,7 @@
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
......@@ -4196,11 +4216,13 @@
},
"wrappy": {
"version": "1.0.2",
"bundled": true
"bundled": true,
"optional": true
},
"yallist": {
"version": "3.0.3",
"bundled": true
"bundled": true,
"optional": true
}
}
},
......
......@@ -8,9 +8,10 @@ const BotaoAnterior = ({ endereco, navigation, disabled, onPress}) => (
(<TouchableOpacity
disabled={disabled}
onPress={onPress}
width={3}
>
<Icon style={styles.icon}
name="md-arrow-back" size={50}
name="md-arrow-back" size={28}
color={ disabled ? 'gray' : "#8400C5"}
/>
</TouchableOpacity>)
......@@ -18,9 +19,10 @@ const BotaoAnterior = ({ endereco, navigation, disabled, onPress}) => (
(<TouchableOpacity
disabled={disabled}
onPress={() => navigation.navigate(endereco)}
width={3}
>
<Icon style={styles.icon}
name="md-arrow-back" size={50}
name="md-arrow-back" size={28}
color={ disabled ? 'gray' : "#8400C5"}
/>
</TouchableOpacity>)
......@@ -30,7 +32,7 @@ const BotaoAnterior = ({ endereco, navigation, disabled, onPress}) => (
const styles = StyleSheet.create({
icon: {
flexDirection: 'column',
alignSelf: 'flex-end',
alignSelf: 'flex-start',
paddingLeft: 10,
paddingRight: 10,
paddingBottom: 10
......
......@@ -8,11 +8,12 @@ class BotaoGrande extends Component {
}
render() {
const { backgroundColor, texto, onPress} = this.props;
const { backgroundColor, texto, onPress, disabled } = this.props;
return (
<TouchableOpacity
style={[styles.buttonStyle, {backgroundColor: backgroundColor}]}
onPress={onPress}
onPress={onPress}
disabled={disabled}
>
<Text style={styles.textStyle}>
{texto}
......@@ -25,11 +26,13 @@ class BotaoGrande extends Component {
BotaoGrande.propTypes = {
backgroundColor: PropTypes.oneOf(['#7500CF', '#00E576']),
texto: PropTypes.string.isRequired,
onPress: PropTypes.func.isRequired
onPress: PropTypes.func.isRequired,
disabled: PropTypes.bool
};
BotaoGrande.defaultProps = {
backgroundColor: '#7500CF',
disabled: false
};
const styles = StyleSheet.create({
......
import React, { Component } from 'react';
import { View, Text, StyleSheet, TouchableOpacity,Image } from 'react-native';
import { View, Text, StyleSheet, TouchableOpacity } from 'react-native';
import { LinearGradient } from 'expo';
import PropTypes from 'prop-types';
import Icon from 'react-native-vector-icons/Ionicons';
import moment from 'moment';
import 'moment/src/locale/pt-br';
// import 'node_modules/moment/locale/pt-br';
......@@ -27,16 +25,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() {
const { status, mensagem, titulo, onPress } = this.props;
......@@ -56,7 +45,7 @@ export default class CardSalaVotacao extends Component {
{titulo}
</Text>
<Text style={styles.subtitulo} numberOfLines={1} ellipsizeMode='tail'>
{this.calculaDescricaoSala('23/05/2019', '19:00')}
{mensagem}
</Text>
</View>
<Icon style={styles.icon}
......
......@@ -38,7 +38,7 @@ export default InputEmail;
InputEmail.propTypes = {
disabled: PropTypes.bool,
isRequired: PropTypes.bool,
label: PropTypes.string.isRequired,
label: PropTypes.string,
max: PropTypes.number,
multiline: PropTypes.bool,
onChangeText: PropTypes.func.isRequired,
......@@ -49,6 +49,7 @@ InputEmail.propTypes = {
InputEmail.defaultProps = {
disabled: false,
label: '',
isRequired: false,
max: undefined,
multiline: false,
......
......@@ -12,8 +12,7 @@ const InputSenha = ({
style,
value,
placeholder
}) => {
return(
}) =>
<View style={style}>
<TextField
baseColor={"#8400C5"}
......@@ -31,9 +30,6 @@ const InputSenha = ({
/>
</View>
);
};
export default InputSenha;
InputSenha.propTypes = {
......
import React from 'react';
import PropTypes from 'prop-types';
import { StyleSheet, Text, View, TouchableOpacity, Alert, Button, StyleSheet, StatusBar } from 'react-native';
import { Text, View, TouchableOpacity } from 'react-native';
export class LoginForm extends Component {
render(){
......
......@@ -4,44 +4,75 @@ import BotaoGrande from '../components/BotaoGrande';
import styles from '../styles/estilos';
import andamento from '../styles/andamento';
import StatusVotacao from '../components/StatusVotacao';
import getStatus from '../utils/getStatus';
export default class Andamento extends Component {
constructor(props) {
super(props);
this.state = {
titulo: ''
titulo: '',
sala: [],
encerrou: false
}
}
static navigationOptions = ({ navigation }) => ({
title: `Sala: ${navigation.state.params.titulo}`,
title: `Sala: ${navigation.state.params.sala.titulo}`,
});
componentWillMount() {
const titulo = this.props.navigation.getParam('titulo', null);
if(titulo)
this.setState({titulo});
}
handleSubmit = () => {
const sala = this.props.navigation.getParam('sala', null);
const encerrou = this.props.navigation.getParam('encerrou', null);
if(sala)
this.setState({sala});
if(encerrou)
this.setState({encerrou});
}
andamentoVotos = () => {
this.props.navigation.navigate('AndamentoVotos', {
'titulo': this.state.titulo
'titulo': this.state.sala.titulo,
'questoes': this.state.sala.questoes,
'votantes': this.state.sala.votantes
})
}
getVotosRealizados = () => {
const { votantes, questoes } = this.state.sala;
if(votantes && questoes) {
const qtdVotantes = votantes.length;
let count = 0;
let { alternativas } = questoes[0];
alternativas.forEach(element => {
if(element && element[1]) {
//contabiliza a qtd de votos nas alternativas da questão[0], já que é obrigatório votar em somente uma.
count = count + element[1];
}
});
const porcentagem = 100*count/qtdVotantes;
return Number(porcentagem).toFixed(2);
}
}
render() {
const { sala, encerrou } = this.state;
return (
<View style={styles.container}>
<Text style={andamento.descricao}>
Essa sala foi criada para decidirmos o layout do aplicativo pooler da Ages 2019/1, o E-Vote.
{sala.descricao}
</Text>
<View>
<StatusVotacao tipo = 'usuario' texto = "100% dos usuários já votaram"/>
<StatusVotacao tipo = 'hora' texto = "A votação encerra as 06h do dia 13/05"/>
<StatusVotacao tipo = 'usuario' texto={`${this.getVotosRealizados() || 0}% dos usuários votaram`} />
<StatusVotacao tipo = 'hora' texto = {
encerrou ? 'Votação encerrou em: ' +
getStatus(
sala.dataFinal,
sala.dataInicial,
sala.horaFinal,
sala.horaInicial,
true
): "Votação ainda não encerrou."
}/>
</View>
<BotaoGrande texto="Andamento" onPress={() => this.andamentoVotos()}/>
</View>
......
import React, { Component } from 'react';
import { Text, View, FlatList, ScrollView } from 'react-native';
import BotaoAnterior from '../components/BotaoAnterior';
import BotaoProximo from '../components/BotaoProximo';
import { Text, View, FlatList, ScrollView, AsyncStorage, TouchableOpacity } from 'react-native';
import QuestaoCard from '../components/QuestaoCard';
import styles from '../styles/estilos';
import andamento from '../styles/andamento';
......@@ -12,64 +10,91 @@ export default class Andamento extends Component {
constructor(props) {
super(props);
this.state = {
qtdVotantes: 5,
questoes: [
{id: 1, titulo:'minha pergunta?',
alternativas: [
{id: 1, titulo: 'alternativa a', votos: 3},
{id: 2, titulo: 'alternativa b', votos: 2},
]},
{id: 2, titulo:'minha pergunta a?',
alternativas: [
{id: 1, titulo: 'alternativa a', votos: 1},
{id: 2, titulo: 'alternativa b', votos: 4},
]},
{id: 3, titulo:'minha pergunta b?',
alternativas: [
{id: 1, titulo: 'alternativa a', votos: 1},
{id: 2, titulo: 'alternativa b', votos: 2},
{id: 3, titulo: 'alternativa c', votos: 2},
]},
{id: 4, titulo:'minha pergunta c?',
alternativas: [
{id: 1, titulo: 'alternativa a', votos: 0},
{id: 2, titulo: 'alternativa b', votos: 0},
{id: 3, titulo: 'alternativa c', votos: 5},
]},
{id: 5, titulo:'minha pergunta d?',
alternativas: [
{id: 1, titulo: 'alternativa a', votos: 0},
{id: 2, titulo: 'alternativa b', votos: 1},
{id: 3, titulo: 'alternativa c', votos: 4},
]},
{id: 6, titulo:'minha pergunta d?',
alternativas: [
{id: 1, titulo: 'alternativa a', votos: 0},
{id: 2, titulo: 'alternativa b', votos: 1},
{id: 3, titulo: 'alternativa c', votos: 4},
]},
]
qtdVotantes: 0,
questoes: []
}
}
static navigationOptions = ({ navigation }) => ({
title: `Sala: ${navigation.state.params.titulo || 'Não localizado'}`
});
handleSubmit=()=>{}
async componentWillMount() {
const questoes = this.props.navigation.getParam('questoes', null);
const votantes = this.props.navigation.getParam('votantes', null);
if(questoes)
this.setState({questoes});
if(votantes)
this.setState({votantes, qtdVotantes: votantes.length});
const uid = await this.getUID();
this.setState({ uid });
}
getUID = async () => {
try{
const id = await AsyncStorage.getItem('@UID');
return id;
}catch (error) {
console.warn("AsyncStorage Error: " + error.message);
}
}
getQtdVotos = (index) => {
const { questoes } = this.state;
let cont = 0;
questoes[index].alternativas.map(alternativa => {
cont = cont + alternativa[1];
});
return cont;
}
confereVoto (alternativa) {
const { uid } = this.state;
let result = 0;
if(alternativa[2]) {
const votantes = alternativa[2];
if(votantes.length > 1){
result = votantes.filter(id => id === uid).length;
}
else if(votantes.length == 1){
if(votantes == uid) {
result = 1;
}
}
}
if(result > 0)
return true;
else
return false;
}
renderItem = ({ item, index }) => {
const { qtdVotantes } = this.state;
const alfabeto = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
const { qtdVotantes, mostrarTitulo, indexMostrar, questaoMostrar } = this.state;
const alfabeto = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n'];
const totalDeVotos = this.getQtdVotos(index);
return (
<View>
<QuestaoCard key={item.id} text={`Q${index+1}. ${item.titulo}`}/>
<QuestaoCard key={item.pergunta} text={`Q${index+1}. ${item.pergunta}`}/>
{
item.alternativas.map((alternativa, index) => {
item.alternativas.map((alternativa, indice) => {
const voto = this.confereVoto(alternativa) || false;
return (
<View key={index + 1} style={andamento.alternativas}>
<IndiceAlternativa indice={`${alfabeto[index]})`} />
<BarraProgresso progresso={(alternativa.votos/qtdVotantes)*100} />
<Text>{(alternativa.votos/qtdVotantes)*100}%</Text>
<View>
<TouchableOpacity
key={indice + 1 + index}
style={andamento.alternativas}
onPress={() => this.setState({ mostrarTitulo: alternativa[0], indexMostrar: indice, questaoMostrar: index})}
>
<IndiceAlternativa destaque={voto} indice={`${alfabeto[indice]})`} />
<BarraProgresso progresso={Number(((alternativa[1]/totalDeVotos)*100).toFixed(1)) || 0} />
<Text>{Number(((alternativa[1]/totalDeVotos)*100).toFixed(5)) || 0}%</Text>
</TouchableOpacity>
{(indexMostrar == indice && questaoMostrar == index) ?
<View key={indice + 2 + index}>
<Text><Text style={{ color: "#8400C5" }}>Alternativa:</Text> {mostrarTitulo}</Text>
</View>:
null}
</View>
);
})
......
import React, { Component } from 'react';
import { View } from 'react-native';
import React, { Component } from 'react';
import { View, ScrollView, Dimensions } from 'react-native';
import styles from '../styles/estilos';
import CardSalaVotacao from '../components/CardSalaVotacao';
import SemSalas from '../containers/SemSalas';
import Barra from '../components/Barra'
import CardSalaVotacao from '../components/CardSalaVotacao';
import Barra from '../components/Barra';
import getStatus from '../utils/getStatus';
class Historico extends Component {
constructor(props) {
super(props)
super(props)
this.state = {
salas: {}
salas: []
}
}
static navigationOptions = {
title: 'Histórico de Votações',
};
handleVisualizar = (titulo) => {
if (titulo)
this.props.navigation.navigate('Andamento', { 'titulo': titulo });
componentWillMount(){
const salas = this.props.navigation.getParam('salas', []);
this.setState({salas});
}
handleVisualizar = (item) => {
if (item)
this.props.navigation.navigate('Andamento', { 'sala': item, 'encerrou': true });
else
this.props.navigation.navigate('Andamento', { 'titulo': 'Não disponível' });
this.props.navigation.navigate('Andamento', { 'sala': 'Não disponível' });
}
render() {
const { salas } = this.state;
const { height } = Dimensions.get('screen');
return (
<View style={styles.container}>
<View>
<CardSalaVotacao
key={1}
onPress = {() => this.handleVisualizar('Assembleia 1')}
status='encerrada'
mensagem='Votação do Sicredi'
titulo='Assembleia 1'
/>
<CardSalaVotacao
key={2}
onPress = {() => this.handleVisualizar('Assembleia 2')}
status='encerrada'
mensagem='Votação do Sicredi - centro'
titulo='Assembleia 2'
/>
</View>
<View style={[styles.container, { height: height }]}>
<ScrollView style={{ maxHeight: height - 160, marginBottom: 5 }}>
<View>
{
salas.length > 0 ?
salas.map((item, index) =>
(getStatus(item.dataFinal,
item.dataInicial, item.horaFinal,
item.horaInicial, false)) == 'encerrada'?
<CardSalaVotacao
key={index}
onPress={() => this.handleVisualizar(item)}
status={getStatus(item.dataFinal,
item.dataInicial, item.horaFinal,
item.horaInicial)}
mensagem={getStatus(item.dataFinal,
item.dataInicial, item.horaFinal,
item.horaInicial, true)}
titulo={item.titulo}
/>:
null
)
:
<SemSalas
texto="Você não participou de votações prévias."
/>
}
</View>
<Barra
index = {true}
onPress={() => this.props.navigation.navigate('Inicio')} />
</ScrollView>
<Barra
index={true}
onPress={() => this.props.navigation.navigate('Inicio')}
/>
</View>
);
}
......
import React, { Component } from 'react';
import { View, ScrollView, Dimensions, Text, FlatList } from 'react-native';
import { View, ScrollView, Dimensions, AsyncStorage, Alert } from 'react-native';
import { db } from '../config';
let salasRef = db.ref('salas/');
import BotaoNovaSala from '../components/BotaoNovaSala';
......@@ -7,115 +7,96 @@ import styles from '../styles/estilos';
import SemSalas from '../containers/SemSalas';
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º'
});
import getStatus from '../utils/getStatus';
export default class Inicio extends Component {
constructor(props) {
super(props);
this.state = {
salas: [],
alternativas: ['#00E576', 'BALALBLABLALBALLABLLBALALBLABLALBALLABLLBALALBLABLALBALLABLLBALALBLABLALBALLABLL', 'HAUHDASHDIASHDOA'],
selected: null
souAdm: false
}
}
static navigationOptions = {
title: 'Votações disponíveis',
};
componentWillMount() {
salasRef.orderByChild("uid").on('value', snapshot => {
let salas = snapshot.val();
if (salas != null) {
salas = Object.values(salas);
this.setState(() => ({
salas
}))
}
AsyncStorage.getItem('@UID').then(uid => {
if (salas != null) {
salas = Object.values(salas);
salas = salas.filter(sala => {
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('Erro ao carregar as salas.', error));
});
}
getStatus = (dataFinal, dataInicial, horaFinal, horaInicial) => {
// 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){
//console.log( 'ag');
return 'agendada';