Commit 32adb93c by Bianca Camargo Machado

Merge branch 'visualizar' into 'dev-sprint4'

[Votar] Ajustes / [Visualiza]

See merge request !48
2 parents 3e8054fe 3d283c2c
{
"expoServerPort": null,
"expoServerNgrokUrl": null,
"packagerNgrokUrl": null,
"ngrokPid": null,
"packagerPort": null,
"packagerPid": null,
"devToolsPort": 19002
"devToolsPort": 19002,
"expoServerPort": 19000,
"packagerPort": 19001,
"packagerPid": 9125,
"expoServerNgrokUrl": "https://cb-8vg.evote.rn-evote.exp.direct",
"packagerNgrokUrl": "https://packager.cb-8vg.evote.rn-evote.exp.direct",
"ngrokPid": 9179
}
\ No newline at end of file
......@@ -3,5 +3,5 @@
"lanType": "ip",
"dev": true,
"minify": false,
"urlRandomness": "xz-g8k"
"urlRandomness": "cb-8vg"
}
\ No newline at end of file
......@@ -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({
......
......@@ -4,7 +4,6 @@ import BotaoGrande from '../components/BotaoGrande';
import styles from '../styles/estilos';
import andamento from '../styles/andamento';
import StatusVotacao from '../components/StatusVotacao';
import moment from 'moment';
import getStatus from '../utils/getStatus';
export default class Andamento extends Component {
......@@ -38,6 +37,23 @@ export default class Andamento extends Component {
})
}
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 (
......@@ -46,7 +62,7 @@ export default class Andamento extends Component {
{sala.descricao}
</Text>
<View>
<StatusVotacao tipo = 'usuario' texto = "100% dos usuários já votaram"/>
<StatusVotacao tipo = 'usuario' texto={`${this.getVotosRealizados() || 0}% dos usuários já votaram`} />
<StatusVotacao tipo = 'hora' texto = {
encerrou ? 'Votação encerrou em: ' +
getStatus(
......@@ -55,7 +71,7 @@ export default class Andamento extends Component {
sala.horaFinal,
sala.horaInicial,
true
): null
): "Votação ainda não encerrou."
}/>
</View>
<BotaoGrande texto="Andamento" onPress={() => this.andamentoVotos()}/>
......
import React, { Component } from 'react';
import { Text, View, FlatList, ScrollView } from 'react-native';
import { Text, View, FlatList, ScrollView, AsyncStorage } from 'react-native';
import QuestaoCard from '../components/QuestaoCard';
import styles from '../styles/estilos';
import andamento from '../styles/andamento';
......@@ -10,50 +10,13 @@ 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=()=>{}
componentWillMount() {
const questoes = this.props.navigation.getParam('questoes', null);
......@@ -65,20 +28,58 @@ export default class Andamento extends Component {
this.setState({votantes, qtdVotantes: votantes.length});
}
componentDidMount(){
const uid = this.getUID();
this.setState({uid});
}
getUID = async () => {
return await AsyncStorage.getItem('@UID');
}
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', 'k', 'l', 'm', 'n'];
const totalDeVotos = this.getQtdVotos(index);
return (
<View>
<QuestaoCard key={item.pergunta} text={`Q${index+1}. ${item.pergunta}`}/>
{
item.alternativas.map((alternativa, index) => {
let voto = this.confereVoto(alternativa);
return (
<View key={index + 1 } style={andamento.alternativas}>
<IndiceAlternativa indice={`${alfabeto[index]})`} />
<BarraProgresso progresso={(alternativa.votos/qtdVotantes)*100} />
<Text>{(alternativa.votos/qtdVotantes)*100}%</Text>
{/*<Text>{alternativa}</Text>*/}
<IndiceAlternativa destaque={voto} indice={`${alfabeto[index]})`} />
<BarraProgresso progresso={Number(((alternativa[1]/totalDeVotos)*100).toFixed(1)) || 0} />
<Text>{Number(((alternativa[1]/totalDeVotos)*100).toFixed(5)) || 0}%</Text>
</View>
);
})
......
import React, { Component } from 'react';
import { View, ScrollView, Dimensions } from 'react-native';
import { db } from '../config';
let salasRef = db.ref('salas/');
import styles from '../styles/estilos';
import SemSalas from '../containers/SemSalas';
import CardSalaVotacao from '../components/CardSalaVotacao';
import Barra from '../components/Barra';
import moment from 'moment';
import getStatus from '../utils/getStatus';
class Historico extends Component {
constructor(props) {
super(props)
this.state = {
salas: []
}
}
static navigationOptions = {
title: 'Histórico de Votações',
};
componentWillMount(){
const salas = this.props.navigation.getParam('salas', []);
this.setState({salas});
}
handleVisualizar = (item) => {
if (item)
this.props.navigation.navigate('Andamento', { 'sala': item, 'encerrou': true });
......@@ -23,18 +29,8 @@ class Historico extends Component {
this.props.navigation.navigate('Andamento', { 'sala': 'Não disponível' });
}
getStatus = (dataFinal, dataInicial, horaFinal, horaInicial, informacaoExtra) => {
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) && !(finalMoment.diff(nowMoment)>=0)) {
return informacaoExtra? finalMoment.format('DD/MM/YYYY HH:mm') : 'encerrada';
}
}
render() {
const salas = this.props.navigation.getParam('salas', []);
const { salas } = this.state;
const { height } = Dimensions.get('screen');
return (
<View style={[styles.container, { height: height }]}>
......@@ -43,16 +39,16 @@ class Historico extends Component {
{
salas.length > 0 ?
salas.map((item, index) =>
(this.getStatus(item.dataFinal,
(getStatus(item.dataFinal,
item.dataInicial, item.horaFinal,
item.horaInicial, false)) == 'encerrada'?
<CardSalaVotacao
key={index}
onPress={() => this.handleVisualizar(item)}
status={this.getStatus(item.dataFinal,
status={getStatus(item.dataFinal,
item.dataInicial, item.horaFinal,
item.horaInicial)}
mensagem={this.getStatus(item.dataFinal,
mensagem={getStatus(item.dataFinal,
item.dataInicial, item.horaFinal,
item.horaInicial, true)}
titulo={item.titulo}
......
import React, { Component } from 'react';
import { View, ScrollView, Dimensions, Text, FlatList, AsyncStorage } 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';
......@@ -8,57 +8,6 @@ import SemSalas from '../containers/SemSalas';
import CardSalaVotacao from '../components/CardSalaVotacao';
import Barra from '../components/Barra';
import getStatus from '../utils/getStatus';
import BotaoAlternativa from '../components/BotaoAlternativa';
import moment from 'moment';
import AuthService from '../shared/AuthService';
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º'
});
export default class Inicio extends Component {
constructor(props) {
......@@ -92,39 +41,48 @@ export default class Inicio extends Component {
}))
}
},
error => console.log('EEERROOOOU', error));
error => console.log('Erro ao carregar as salas.', error));
});
}
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';
podeVotar = (item, indice) => {
const { uid } = this.state;
const { questoes } = item;
let result = true;
//se já votou retorna false
questoes.map((questao, index) => {
let { alternativas } = questao;
alternativas.forEach(element => {
if(element && element[2]) {
result = !(element[2].filter(id => id === uid).length);
return result;
}
});
});
if(result)
return true;
else
return false;
}
handleVisualizar = (item) => {
const { uid } = this.state
handleVisualizar = (item, index) => {
const { uid, salas } = 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 });
if(this.podeVotar(item, index))
this.props.navigation.navigate('Votacao', { 'sala': item, 'salas': salas, 'indiceSala': index });
else
return Alert.alert(
'⚠️ Aviso:',
'Você já votou nesta sala!',
[
{text: 'OK'},
]
);
} else {
this.props.navigation.navigate('Votacao', { 'sala': 'Não disponível' });
this.props.navigation.navigate('Votacao', { 'sala': item, 'salas': salas, 'indiceSala': index });
}
}
......@@ -132,30 +90,14 @@ export default class Inicio extends Component {
this.setState({ selected });
}
getSalas = async () => {
}
getMinhasSalas = async salas => {
const uid = await AsyncStorage.get('@UID');
consol.log(uid)
return salas;
}
getHistorico = salas => salas.filter(item => {
const {dataFinal, dataInicial, horaFinal, horaInicial } = item;
return this.getStatus(dataFinal, dataInicial, horaFinal, horaInicial, false) == 'encerrada';
return getStatus(dataFinal, dataInicial, horaFinal, horaInicial, false) == 'encerrada';
})
render() {
const { salas } = this.state;
const { height } = Dimensions.get('screen');
// let x = await this.getMinhasSalas(salas);
const salasmock = [{
dataFinal: '28/06/2019', dataInicial:'28/06/2019', horaFinal:'28/06/2019', horaInicial:'28/06/2019', descricao:'a',titulo:'a'
}]
return (
<View style={[styles.container, { height: height }]}>
<ScrollView style={{ maxHeight: height - 240, marginBottom: 5 }}>
......@@ -168,7 +110,7 @@ export default class Inicio extends Component {
item.horaInicial)) != 'encerrada'?
<CardSalaVotacao
key={index}
onPress={() => this.handleVisualizar(item)}
onPress={() => this.handleVisualizar(item, index)}
status={getStatus(item.dataFinal,
item.dataInicial, item.horaFinal,
item.horaInicial)}
......
......@@ -4,14 +4,13 @@ import { auth } from '../config';
import InputEmail from '../components/InputEmail';
import InputSenha from '../components/InputSenha';
import styles from '../styles/estilos';
import AuthService from '../shared/AuthService';
export default class Login extends Component {
constructor(props) {
super(props)
this.state = {
salas: {},
email: 'dev@evote.com',
email: 'email@id.com',
senha: '123456',
errorMessage:''
}
......@@ -22,12 +21,9 @@ export default class Login extends Component {
auth
.signInWithEmailAndPassword(email, senha)
.then((data) => {
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);
......@@ -88,7 +84,6 @@ export default class Login extends Component {
</KeyboardAvoidingView>
);
}
}
const custom = StyleSheet.create({
......
......@@ -157,7 +157,8 @@ export default class Questao extends Component {
this.setState({erroAlternativa: ""});
let { questao } = this.state;
this.setState({erroPergunta: ""});
questao[questao.length-1].alternativas[index] = text;
// [ text, 0, []] = texto da alternativa : contador de votos : array de votantes dessa alternativa
questao[questao.length-1].alternativas[index] = [text, 0, votantes = []];
this.setState({questao: questao});
}
......
......@@ -42,7 +42,7 @@ export default class Sala extends Component {
AsyncStorage.getItem('@UID').then(uid => {
this.setState({sala: {...this.state.sala, adm_uid: uid}});
},
error => console.log('EEERROOOOU', error));
error => console.log('Verifique as credencias.', error));
}
horaInvalida = (hF,hI) => {
......
......@@ -20,11 +20,11 @@ export default class VisualizarQuestao extends Component {
componentWillMount() {
if(this.props.navigation) {
const { questoes , index } = this.props.navigation.state.params;
const { questoes , index, sala, salas, indiceSala } = this.props.navigation.state.params;
if(index) {
this.setState({ index });
}
this.setState({ questoes });
this.setState({ questoes, sala, salas, indiceSala });
}
}
......@@ -41,9 +41,9 @@ export default class VisualizarQuestao extends Component {
this.setState({ votacaoIniciada: true });
}
onChange = (nextIndex, selected) => {
onChange = (nextIndex, selected, alternativasVotadas) => {
// não está registrando voto no firebase ainda
this.setState({ votacaoIniciada: false, index: nextIndex });
this.setState({ votacaoIniciada: false, index: nextIndex, alternativasVotadas });
}
informacoesDaQuestao = () => {
......@@ -75,8 +75,22 @@ export default class VisualizarQuestao extends Component {
);
}
getAlternativasVotadas = () => {
const { alternativasVotadas, index } = this.state;
if(alternativasVotadas && alternativasVotadas[index] && alternativasVotadas[index]["alternativaSelecionada"])
return alternativasVotadas[index]["alternativaSelecionada"];
return -1;
}
render() {
const { questoes, index, votacaoIniciada } = this.state;
const {
questoes,
index,
votacaoIniciada,
alternativasVotadas,
salas,
indiceSala
} = this.state;
return (
!votacaoIniciada ?
<View style={styles.container}>
......@@ -91,14 +105,18 @@ export default class VisualizarQuestao extends Component {
</View>
</View>
:
//mostra alternativas a partir daqui
//mostra alternativas a partir daqui
<Votar
navigation = {this.props.navigation}
selected={0}
selected={this.getAlternativasVotadas()}
index={index}
size={questoes.length}
questao={questoes[index]}
onChange={(index, selected) => this.onChange(index, selected)}
questoes={questoes}
salas={salas}
indiceSala={indiceSala}
onChange={(index, selected, alternativasVotadas) => this.onChange(index, selected, alternativasVotadas)}
alternativasVotadas={alternativasVotadas}
/>
);
}
......
......@@ -19,8 +19,8 @@ export default class Votacao extends Component {
componentWillMount() {
if(this.props.navigation) {
const { sala } = this.props.navigation.state.params;
this.setState({ sala });
const { sala, salas, indiceSala } = this.props.navigation.state.params;
this.setState({ sala, salas, indiceSala });
}
}
......@@ -28,19 +28,15 @@ export default class Votacao extends Component {
title: `Sala: ${navigation.state.params.sala.titulo}`,
});
handleDownload = async () => { //não funciona ainda
const url = await storageRef.child('ambiente-de-desenvolvimento-rn.pdf').getDownloadURL();
const filePath = await `${FileSystem.documentDirectory}eVote/ambiente-de-desenvolvimento-rn.pdf`;
const res = await FileSystem.downloadAsync(url, filePath);
const i = await FileSystem.getInfoAsync(res.uri);
console.log(i); //{"isDirectory":0,"exists":0}
handleDownload = async () => {
// não implementado
}
visualizarQuestao = () => {
const { sala } = this.state;
const { sala, indiceSala, salas } = this.state;
const { questoes } = this.state.sala;
if (sala && questoes)
this.props.navigation.navigate('VisualizarQuestao', { 'questoes': questoes, 'titulo': sala.titulo });
this.props.navigation.navigate('VisualizarQuestao', { 'questoes': questoes, 'titulo': sala.titulo, 'sala': sala, 'indiceSala': indiceSala, 'salas': salas });
else
this.props.navigation.navigate('VisualizarQuestao', { 'questoes': 'Não disponível' });
}
......
import React, { Component } from 'react';
import { View, Text, FlatList, ActivityIndicator } from 'react-native';
import { View, Text, FlatList, ActivityIndicator, ScrollView, AsyncStorage } from 'react-native';
import BotaoProximo from '../components/BotaoProximo';
import NotificacaoHeader from '../components/NotificacaoHeader';
import BotaoAlternativa from '../components/BotaoAlternativa';
import { db } from '../config';
import Aviso from '../components/Aviso';
import styles from '../styles/estilos';
import votarStyles from '../styles/votarStyles';
import BotaoMedio from '../components/BotaoMedio';
import BotaoAnterior from '../components/BotaoAnterior';
let alternativasRef = db.ref('alternativas/');
import { db } from '../config';
let salasRef = db.ref('salas/');
export default class Votar extends Component {
constructor(props) {
super(props);
this.state = {
index: 0,
selected: 0,
selected: -1,
alternativas: [],
sending: false,
sent: false
sent: false,
alternativasVotadas: [],
erro: ''
}
}
componentWillMount() {
alternativasRef.orderByChild("uid").on('value', snapshot => {
let alternativas = snapshot.val();
if (alternativas != null) {
alternativas = Object.values(alternativas);
this.setState(() => ({
alternativas
}))
}
});
componentDidMount() {
const { salas, indiceSala } = this.props;
const { alternativas } = this.props.questao;
this.setState({ alternativas, indiceSala, salas });
}
componentDidMount() {
const { alternativas } = this.props.questao;
this.setState({ alternativas });
getUID = async () => {
return await AsyncStorage.getItem('@UID');
}
handleSubmit = async () => {
......@@ -50,61 +46,77 @@ export default class Votar extends Component {
}
sendData = async () => {
const { alternativas } = this.state;
const { salas } = this.state;
this.setState({ sending: true });
const response = await
//TODO chamar os dados das alternativas
//TODO armazenar votos corretamente
db.ref('alternativas/'+ '-Lg0cDaAFkiD4kTYCjBG').set({
...alternativas
}).then(() => {
return true;
}).catch((error) => {
console.warn('error ', error);
return false;
await salasRef.remove();
await salas.forEach( sala => {
salasRef.push({
...sala
});
return response;
});
return true;
}
finalizarVoto = async () => {
const { alternativas } = this.state;
let { questoes } = this.props;
let { alternativasVotadas, salas, indiceSala } = this.state;
let alternativasVotadas;
if(alternativas && alternativas.totalVotos) {
alternativasVotadas = alternativas;
alternativasVotadas.totalVotos +=1;
}
else {
alternativasVotadas = Object.assign(alternativas, { 'totaslVotos': 1 });
for(x = 0; x < salas[indiceSala]['questoes'].length; x++){
for(y = 0; y < questoes[x].alternativas.length; y++){
if(alternativasVotadas[x][y] >= 0) {
let posicaoAlternativa = alternativasVotadas[x][y];
let contadorVotos = questoes[x].alternativas[posicaoAlternativa][1];
contadorVotos = contadorVotos + 1;
questoes[x].alternativas[posicaoAlternativa][1] = contadorVotos;
if(questoes[x].alternativas[posicaoAlternativa][2])
questoes[x].alternativas[posicaoAlternativa][2].push(await this.getUID());
else {
questoes[x].alternativas[posicaoAlternativa][2] = new Array(await this.getUID());
}
}
}
}
salas[indiceSala]['questoes'] = questoes;
this.setState({ salas });
const sent = await this.sendData();
if (sent) {
this.setState({ sending: false });
this.setState({ sent: true });
}
this.setState({ sending: false });
}
handleNavigation = ( mudanca ) => {
const { index, onChange } = this.props;
const { selected } = this.state;
if (mudanca === 0) {
if(index > 0)
this.setState({index: index });
onChange(this.state.index);
const { selected, alternativasVotadas } = this.state;
if(selected != -1) {
if (mudanca === 0) {
if(index > 0)
this.setState({index: index });
onChange(this.state.index, alternativasVotadas);
} else {
this.setState({ index: index +1 });
onChange(this.props.index+1, selected, alternativasVotadas);
}
} else {
this.setState({index: index +1 });
onChange(this.props.index+1, selected);
this.setState({ erro: "Selecione alguma alternativa" });
}
}
handleSelect = (index) => {
this.setState({ selected: index });
let alternativasVotadas = this.props.alternativasVotadas || this.state.alternativasVotadas;
if(alternativasVotadas)
this.setState({ selected: index, erro: '' });
alternativasVotadas[this.props.index] = [ index ];
this.setState({alternativasVotadas})
}
render() {
const { selected, sending, sent } = this.state;
const { selected, sending, sent, erro } = this.state;
const { index, questao } = this.props;
return (
sent ?
......@@ -138,13 +150,14 @@ export default class Votar extends Component {
</View>
:
<View style={styles.container}>
<View>
<ScrollView>
<Text style={votarStyles.pergunta}>
{questao.pergunta}
</Text>
<NotificacaoHeader
texto="Selecione uma alternativa (verde = selecionado)"
/>
<View><Aviso texto={erro} /></View>
<FlatList
style={{ marginTop: 20 }}
data={questao.alternativas}
......@@ -154,14 +167,14 @@ export default class Votar extends Component {
<BotaoAlternativa
onPress={() => this.handleSelect(index)}
index={index}
text={item}
text={item[0]}
selectedIndex={selected}
/>
</View>
)}
keyExtractor={(item, index) => index.toString()}
/>
</View>
</ScrollView>
{this.props.index.valueOf() < this.props.size.valueOf()-1 ?
<View style={[styles.flowButtonsContainer, { marginTop: 5 }]}>
<BotaoAnterior
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!