Skip to content
Merged
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
1 change: 1 addition & 0 deletions app.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export default {
"orientation": "portrait",
"icon": "./assets/images/icon.png",
"scheme": "cosmos",
"deepLinking": true,
"userInterfaceStyle": "automatic",
"newArchEnabled": true,
"ios": {
Expand Down
62 changes: 54 additions & 8 deletions app/(tabs)/agenda/agendaView.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { Ionicons } from '@expo/vector-icons';
import { useState } from 'react';
import { Modal, Pressable, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { AddTaskToAgenda } from '@/components/addTaskToAgenda';
import { ConfigAgenda } from '@/components/configAgenda';
import { PublicTaskItem } from '@/components/publicAgendaItem';
import { Ionicons } from '@expo/vector-icons';
import { useEffect, useState } from 'react';
import { FlatList, Modal, Pressable, StyleSheet, Text, View } from 'react-native';
import { FAB } from 'react-native-paper';
import { SafeAreaView } from 'react-native-safe-area-context';

type Props = {
data: {
Expand All @@ -17,10 +18,43 @@ type Props = {
handleClose: () => void
};

type Task = {
name_task: string
}

export default function ViewAgenda({ data, handleClose }: Props) {

const [configVisible, setConfigVisible] = useState(false);
const [addTaskVisible, setAddTaskVisible] = useState(false);
const [arrayAgendaTasks, setArrayAgendaTasks] = useState<Task[]>([])

const chave = encodeURIComponent(process.env.EXPO_PUBLIC_API_KEY ?? '');

const loadTasks = async (): Promise<Task[]> => {
const url = `${process.env.EXPO_PUBLIC_API_URL}/docs/getAllTarefasFromOneAgenda?uid_da_agenda=${data.uid_da_agenda}&api_key=${chave}`

try {
const response = await fetch(url);
if (!response.ok) {
const text = response.text();
console.log(`${response.status} - ${text}`);
return [];
}
const data: Task[] = await response.json()
return data;
} catch (err) {
console.log('erro ao puxar os dados', err);
return [];
}
}

useEffect(() => {
async function useLoad() {
const array: Task[] = await loadTasks();
setArrayAgendaTasks(array);
}
useLoad();
},[]);

return (
<SafeAreaView style={styles.container} edges={['left', 'right']}>
Expand All @@ -32,19 +66,31 @@ export default function ViewAgenda({ data, handleClose }: Props) {
<Pressable onPress={() => setConfigVisible(true)} style={styles.agendaConfig}>
<Text style={styles.title}>{data.nome_agenda}</Text>
</Pressable>

<Modal animationType="slide" visible={configVisible}>
<ConfigAgenda closeAll={handleClose} handleClose={() => setConfigVisible(false)} data={data} />
</Modal>
</View>
<FlatList
data={arrayAgendaTasks}
keyExtractor={(item)=> item.name_task.toString()}
renderItem={({ item }) => {
return <PublicTaskItem data={item} />
}}
/>

<View style={{flex: 1}}>
<View style={{ flex: 1 }}>
<Modal animationType='slide' visible={addTaskVisible} onRequestClose={() => setAddTaskVisible(false)}>
<AddTaskToAgenda data={data} handleClose={() => setAddTaskVisible(false)} />
<AddTaskToAgenda
data={data}
handleClose={() =>{
setAddTaskVisible(false);
}}
/>
</Modal>

<FAB
icon="plus"
onPress={()=> setAddTaskVisible(true)}
onPress={() => setAddTaskVisible(true)}
style={styles.button}
/>
</View>
Expand Down
22 changes: 22 additions & 0 deletions app/(tabs)/agenda/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import { FlatList, Modal, RefreshControl, StyleSheet, Text, View } from "react-n
import { ActivityIndicator, FAB } from 'react-native-paper';
import { SafeAreaView } from 'react-native-safe-area-context';
import CreateAgenda from "./createGroup";
import { FAB, ActivityIndicator } from 'react-native-paper';
import { ComeToGroup } from "@/components/comeToGroup";

type Agendas = {
uid_da_agenda: string
Expand All @@ -17,9 +19,11 @@ type Agendas = {
};

export default function Agenda() {

const [userUid, setUserUid] = useState<string | null>(null);
const [agendas, setAgendas] = useState<Record<string, Agendas>>({});
const [refreshing, setRefreshing] = useState(true);
const [visibleComeInToGroup, setVisibleComeInToGroup] = useState(false);
const [visibleCreateGroup, setVisibleCreate] = useState(false);
const [loading, setLoading] = useState<boolean>(false);
const focused = useIsFocused();
Expand Down Expand Up @@ -116,12 +120,23 @@ export default function Agenda() {
<CreateAgenda handleClose={() => setVisibleCreate(false)} onCreated={onAgendaCreated} />
</Modal>

<Modal transparent={true} visible={visibleComeInToGroup} animationType="fade">
<ComeToGroup handleClose={()=> setVisibleComeInToGroup(false)}/>
</Modal>

<FAB
icon="plus"
label="Criar um grupo"
onPress={() => setVisibleCreate(true)}
style={styles.btnCreate}
/>

<FAB
icon="plus"
label="Entrar num grupo"
onPress={() => setVisibleComeInToGroup(true)}
style={styles.btnAdd}
/>
</SafeAreaView>
</View>
);
Expand Down Expand Up @@ -152,6 +167,13 @@ const styles = StyleSheet.create({
right: 16,
bottom: 16,
},

btnAdd:{
position: 'absolute',
left: 16,
bottom: 16
},

btnCreateTxt: {
color: "#FFF",
fontWeight: "bold",
Expand Down
185 changes: 185 additions & 0 deletions components/comeToGroup.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
import { Ionicons } from "@expo/vector-icons";
import { getApp } from '@react-native-firebase/app';
import { getAuth } from '@react-native-firebase/auth';
import { useEffect, useState } from "react";
import { StyleSheet, Text, TextInput, TouchableOpacity, View } from "react-native";
import { FAB } from 'react-native-paper';

type Props = {
handleClose: () => void;

}

type Agenda = {
id: string
uid_da_agenda: string
nome_agenda: string
chave_de_convite: string
firstCreated: string
};

export function ComeToGroup({ handleClose }: Props) {

const [userUid, setUserUid] = useState('');

useEffect(() => {
const auth = getAuth(getApp());
setUserUid(auth.currentUser?.uid ?? '');
}, []);

const [objectAgenda, setObjectAgenda] = useState<Agenda>()
const [inviteCode, setInviteCode] = useState('');
const chave = encodeURIComponent(process.env.EXPO_PUBLIC_API_KEY ?? '');

const urlGetAgendaCode = `${process.env.EXPO_PUBLIC_API_URL}/invite/${inviteCode}`


const getAgendaByCode = async (): Promise<Agenda | undefined> => {
try {
const response = await fetch(urlGetAgendaCode)
if (!response.ok) {
const text = response.text();
console.log(`${response.status} - ${text}`);
return undefined;
}
const data: Agenda = await response.json();
console.log('data: ', data);
return data;
} catch (err) {
console.log('erro ao armazenar a agenda: ', err);
return undefined;
}
}

useEffect(() => {
if (objectAgenda) {
console.log('Agenda atualizada:', objectAgenda.uid_da_agenda);
}
}, [objectAgenda]);



const enterInAgenda = async () => {
const data = await getAgendaByCode();
if (data) {
console.log(data.uid_da_agenda)
setObjectAgenda(data)

}

const urlAddAgenda = `${process.env.EXPO_PUBLIC_API_URL}/add/agenda/membro?uid_da_agenda=${data?.uid_da_agenda}&uid_do_membro=${userUid}&api_key=${chave}`

const response = await fetch(urlAddAgenda, {
method: 'POST'
});
try {
const json = await response.json();
console.log('API response: ', json);
handleClose();
alert('Você entrou na agenda!')
} catch (err) {
console.log('erro ao entrar na agenda: ', err);
throw err
}

}

return (
<View style={styles.container}>
<View style={styles.content}>
<View style={styles.text}>
<TouchableOpacity style={styles.close} onPress={handleClose}>
<Ionicons size={30} color={"purple"} name={"close"} />
</TouchableOpacity>
<Text style={styles.label}>Digite o código de convite:</Text>
<TextInput
style={styles.textInput}
value={inviteCode}
onChangeText={setInviteCode}
placeholder='Digite o código de convite da agenda'
placeholderTextColor={"gray"}
accessibilityLabel="Nome da Atividade"
nativeID="atividadeNameInput"
/>
</View>
<Text style={{ fontSize: 18, fontWeight: "bold" }}></Text>
<FAB
icon="arrow-right"
label="Confirmar"
style={styles.button}
onPress={() => {
if (inviteCode === "") {
alert('Insira um código de convite!')
}
else {
enterInAgenda()
}
}}
/>
</View>
</View>
)
}

const styles = StyleSheet.create({
container: {
padding: "3%",
backgroundColor: "rgba(93, 93, 93, 0.5)",
flex: 1,
justifyContent: "center",
alignItems: "center"
},

text: {
width: "100%",
alignItems: "center",
},
nameAgenda: {
fontSize: 23,
marginVertical: 15,
fontWeight: 'bold'
},

close: {
position: "absolute",
top: -20,
left: -5
},

content: {
justifyContent: "center",
alignItems: "center",
width: "90%",
padding: 15,
backgroundColor: "#FFF",
borderRadius: 8,
paddingBottom: 30,
paddingTop: 30,
},
textInput: {
borderWidth: 1,
borderColor: "purple",
marginTop: 15,
borderRadius: 8,
width: "100%",
padding: 10
},
button: {
color: '#FFF',
backgroundColor: "#b686f4",
height: 50,
width: 150,
borderRadius: 6,
justifyContent: "center",
alignItems: "center"
},

btnText: {
color: "#FFF",
fontSize: 17,
fontWeight: "bold"
},
label: {
fontSize: 17
}
})
Loading