Skip to content

Commit

Permalink
Merge pull request #11 from fga-eps-mds/denuncia-post
Browse files Browse the repository at this point in the history
Denuncia post
  • Loading branch information
ArturVinicius authored Jan 29, 2025
2 parents 32a3525 + dff3a1c commit e78bbd4
Show file tree
Hide file tree
Showing 11 changed files with 504 additions and 156 deletions.
Empty file modified .docker/entrypoint.sh
100755 → 100644
Empty file.
Empty file modified .docker/entrypoint.test.sh
100755 → 100644
Empty file.
Empty file modified src/app/components/ModalButtons.tsx
100755 → 100644
Empty file.
38 changes: 36 additions & 2 deletions src/app/components/Publicacao.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from "react";
import { View, Image, Text, StyleSheet, Pressable } from "react-native";
import { View, Image, Text, StyleSheet, Pressable, Button } from "react-native";
import { IPublicacao } from "../interfaces/forum.interface";
import Icon from "react-native-vector-icons/MaterialCommunityIcons";
import { router } from "expo-router";
Expand Down Expand Up @@ -37,6 +37,16 @@ export default function Publicacao({ item, crop }: Readonly<IProps>) {
return date.toLocaleDateString("pt-BR");
};

const makeReport = () => {
const params = { ...item, ...item.usuario, id: item.id };

router.push({
pathname: "/private/pages/criarDenuncia",
params: { ... params},
});
}


const navigate = () => {
const params = { ...item,
id: item.id,
Expand All @@ -46,7 +56,9 @@ export default function Publicacao({ item, crop }: Readonly<IProps>) {

router.push({
pathname: "/private/pages/visualizarPublicacao",
params: params,
params: {
...params
},
});
};

Expand Down Expand Up @@ -85,6 +97,23 @@ export default function Publicacao({ item, crop }: Readonly<IProps>) {
</View>
</View>
<Text style={styles.postContent}>{getDescricao(item.descricao)}</Text>
<View style={styles.iconContainer}>
<Pressable onPress={() => {console.log("Não implementado")}}>
<Icon name="thumb-up-outline" size={25} />
</Pressable>
<Pressable onPress={() => {console.log("Não implementado")}}>
<Icon name="comment-outline" size={25} />
</Pressable>
<Pressable onPress={() => {console.log("Não implementado")}}>
<Icon name="star-outline" size={25} />
</Pressable>
<Pressable onPress={() => {console.log("Não implementado")}}>
<Icon name="eye-outline" size={25} />
</Pressable>
<Pressable onPress={makeReport}>
<Icon name="flag" color={"red"} size={25} />
</Pressable>
</View>
<View style={styles.underInfo}>
{item.idUsuarioReporte && item.idUsuarioReporte.length > 0 && (
<View style={styles.reports}>
Expand All @@ -98,6 +127,11 @@ export default function Publicacao({ item, crop }: Readonly<IProps>) {
}

const styles = StyleSheet.create({
iconContainer: {
flexDirection: 'row',
justifyContent: 'space-between',
marginTop: 10,
},
postContainer: {
margin: 10,
borderRadius: 14,
Expand Down
187 changes: 134 additions & 53 deletions src/app/components/PublicacaoVisualizar.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,67 @@
import React from "react";
import { View, Image, Text, StyleSheet } from "react-native";
import { IPublicacao, IPublicacaoBody, IPublicacaoUsuario } from "../interfaces/forum.interface";
import Icon from "react-native-vector-icons/MaterialCommunityIcons";
import AntDesing from "react-native-vector-icons/AntDesign";
import { hasFoto } from "../shared/helpers/foto.helper";
import AsyncStorage from "@react-native-async-storage/async-storage";
import React, { useEffect, useState } from "react";
import { StyleSheet, Text, View } from "react-native";
import AntDesign from "react-native-vector-icons/AntDesign";
import { IDenuncia, IPublicacaoUsuario } from "../interfaces/forum.interface";
import { getFoto } from "../shared/helpers/photo.helper";

interface IProps {
item: IPublicacaoUsuario;
}

export default function PublicacaoVisualizar({ item }: IProps) {
const URL_DENUNCIAS = `${process.env.EXPO_PUBLIC_API_URL}:${process.env.EXPO_PUBLIC_API_FORUM_PORT}/api/forum/denuncias`;

export default function PublicacaoVisualizar({ item: itemPublicacao }: IProps) {
const [denuncias, setDenuncias] = useState<{ [idUsuario: number]: IDenuncia[] }>({});
const [token, setToken] = useState("");

useEffect(() => {
const getDenuncias = async () => {
const token = await AsyncStorage.getItem("token");

if (!token) {
console.error("Token não encontrado.");
return;
}

setToken(token);

try {
const response = await fetch(`${URL_DENUNCIAS}/byPublicacaoId/${itemPublicacao.id}`, {
headers: {
Authorization: `Bearer ${token}`,
},
});

const dataDenuncias = await response.json();

if (!Array.isArray(dataDenuncias.data)) {
console.error("Erro ao buscar denúncias:", dataDenuncias);
return;
}

// Agrupar denúncias por usuário
const groupedDenuncias = dataDenuncias.data.reduce(
(acc: { [idUsuario: number]: IDenuncia[] }, denuncia: IDenuncia) => {
if (denuncia.idUsuario !== undefined && !acc[denuncia.idUsuario]) {
acc[denuncia.idUsuario] = [];
}
if (denuncia.idUsuario !== undefined) {
acc[denuncia.idUsuario].push(denuncia);
}
return acc;
},
{}
);

setDenuncias(groupedDenuncias);
} catch (error) {
console.error("Erro ao buscar denúncias:", error);
}
};

getDenuncias();
}, []);

const getFormattedDate = (payload: Date | string): string => {
const date = new Date(payload);
Expand All @@ -19,22 +71,42 @@ export default function PublicacaoVisualizar({ item }: IProps) {
return (
<View style={styles.postContainer}>
<View style={styles.userInfo}>
{getFoto(item.foto)}
<Text style={styles.username}>{item.nome || "Usuário deletado"}</Text>
{getFoto(itemPublicacao.foto)}
<Text style={styles.username}>{itemPublicacao.nome || "Usuário deletado"}</Text>
</View>
<Text style={styles.titulo}>{item.titulo}</Text>
<Text style={styles.descricao}> {item.descricao || "Descrição indisponível"} </Text>
<Text style={styles.titulo}>{itemPublicacao.titulo}</Text>
<Text style={styles.descricao}>{itemPublicacao.descricao}</Text>
<View style={styles.underInfo}>
<Text style={styles.categoria}>{item.categoria}</Text>
<Text style={styles.date}>{getFormattedDate(item.dataHora)}</Text>
<Text style={styles.categoria}>{itemPublicacao.categoria}</Text>
<Text style={styles.date}>{getFormattedDate(itemPublicacao.dataHora)}</Text>
</View>
<View style={styles.secondUnderInfo}>
{item.idUsuarioReporte && item.idUsuarioReporte.length > 0 && (
<View style={styles.reports}>
<AntDesing name="warning" size={18} color="#FFCC00" />
<Text style={styles.reportsText}>Usuários reportaram</Text>
</View>
)}
{itemPublicacao.idUsuarioReporte && itemPublicacao.idUsuarioReporte.length > 0 && (
<View style={styles.reports}>
<View style={styles.reportsContainer}>
<View style={{ flexDirection: "row", alignItems: "center", justifyContent: 'center', marginBottom: 5, marginTop: 10, gap: 7 }}>
<AntDesign name="warning" size={18} color="#FFCC00" />
<Text style={styles.reportsText}>
Reportada por {Object.keys(denuncias).length} usuário(s)
</Text>
</View>
{Object.entries(denuncias).map(([idUsuario, userDenuncias]) => (
<View key={idUsuario} style={styles.reportGroup}>
<Text style={styles.reportUser}>Usuário {idUsuario}</Text>
{userDenuncias.map((denuncia, index) => (
<View key={index} style={styles.reportItem}>
<Text style={styles.reportReason}>Motivo: {denuncia.motivo}</Text>
<Text style={styles.reportDescription}>Descrição: {denuncia.descricao}</Text>
<Text style={styles.reportDate}>
Data: {getFormattedDate(denuncia.dataHora)}
</Text>
</View>
))}
</View>
))}
</View>
</View>
)}
</View>
</View>
);
Expand All @@ -51,28 +123,17 @@ const styles = StyleSheet.create({
shadowOpacity: 0.5,
shadowRadius: 2,
padding: 15,
display: "flex",
flexDirection: "column",
height: "auto",
},
userInfo: {
flexDirection: "row",
alignItems: "center",
width: "100%",
},
fotoPerfil: {
width: 65,
aspectRatio: 1,
borderRadius: 140,
},
username: {
color: "#b4026d",
opacity: 0.8,
fontSize: 18,
marginLeft: 13,
marginBottom: 3,
fontWeight: "600",
width: "80%",
color: "#000",
opacity: 0.6,
fontSize: 16,
marginLeft: 15,
fontWeight: "500",
},
titulo: {
fontSize: 16,
Expand All @@ -86,42 +147,62 @@ const styles = StyleSheet.create({
},
underInfo: {
flexDirection: "row",
alignItems: "center",
width: "100%",
justifyContent: "space-between",
marginTop: 30,
},
secondUnderInfo: {
flexDirection: "row",
justifyContent: "flex-end",
width: "100%",
marginTop: 10,
},
reports: {
flexDirection: "row",
alignItems: "center",
padding: 8,
backgroundColor: "#FFF4E5",
borderRadius: 8,
},
reportsText: {
color: "#FFCC00",
marginLeft: 3,
},
semFoto: { position: "relative", backgroundColor: "#EFEFF0" },
semFotoIcon: {
position: "absolute",
right: "38%",
bottom: "38%",
opacity: 0.4,
margin: "auto",
alignSelf: "center",
zIndex: 1,
fontSize: 14,
color: "#FF8800",
textAlign: "center",
},
reportsContainer: {
flexDirection: "column",
width: "95%",
},
reportGroup: {
padding: 10,
borderRadius: 5,
marginVertical: 5,
},
reportUser: {
fontSize: 14,
fontWeight: "bold",
color: "#442200",
},
reportItem: {
marginTop: 5,
},
reportReason: {
fontSize: 14,
color: "#663300",
},
reportDescription: {
fontSize: 14,
fontStyle: "italic",
color: "#884400",
},
reportDate: {
fontSize: 12,
color: "#AA5500",
},
categoria: {
marginRight: 15,
color: "#137364",
fontWeight: "500",
},
date: {
color: "#000000",
color: "#000",
fontSize: 14,
},
});
});
9 changes: 8 additions & 1 deletion src/app/interfaces/forum.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,15 @@ export interface IPublicacaoParams extends IPublicacaoBody, IUser {
usuario?: IUser;
idUsuarioReporte: string;
}
export interface IDenuncia {
dataHora: Date | string;
id: number;
idUsuario?: number;
motivo: string;
descricao: string;
}

export interface IPublicacaoUsuario extends IPublicacao, IUser {}
export interface IPublicacaoUsuario extends IPublicacao, IUser { }

export interface IPublicacaoFilter {
titulo?: string;
Expand Down
Loading

0 comments on commit e78bbd4

Please sign in to comment.