Olá Devs!
Poderiam por gentileza me dar uma ajuda?
Estou tentando adicionar abaixo do card de formulário(form/input), uma lista que deve aparecer um outro card com uma listagem de todas avaliações daquele filme, um card na sequencia do outro, porém quando começo a digitar, as informações são inseridas diretamente, sem clicar no botão salvar e é inserida uma única vez e na verdade que a cada vez que digitasse uma avaliação e clicasse no botão teria que adicionar mais um card com a avaliação…e não estou conseguindo(abaixo esta duplicado pois utilizei dois containers, para testar qual seria melhor opção:
Esta é o código do card MovieDetails:
import { ReactComponent as Start } from 'assets/images/star.svg';
import axios from 'axios';
import { useParams } from 'react-router-dom';
import { Movie } from 'types/movie';
import { BASE_URL } from 'util/requests';
import { hasAnyRoles } from 'util/auth';
import ButtonIcon from 'components/ButtonIcon';
import { useForm } from 'react-hook-form';
import { useEffect, useState } from 'react';
import Evaluation from 'components/Evaluation';
import CommentDetails from 'components/CommentDetails';
import MovieCard from 'components/MovieCard';
import './styles.css';
type FormData = {
name: string;
description: string;
};
type UrlParams = {
moviesId: string;
};
const MovieDetails = () => {
const { moviesId } = useParams<UrlParams>();
const [movie, setMovie] = useState<Movie>();
const { register, handleSubmit } = useForm<FormData>();
const [formData, setFormData] = useState<FormData>({
name: '',
description: '',
});
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
const name = event.target.name;
const value = event.target.value;
setFormData({ ...formData, [name]: value });
};
const onSubmit = (formData: FormData) => {
console.log(formData.description);
formData.description.toString();
};
useEffect(() => {
axios
.get(`${BASE_URL}/movies/${moviesId}`)
.then((response) => {
setMovie(response.data);
})
.finally(() => {});
}, [moviesId]);
return (
<div className="movie-details-container">
<div className="base-card movie-details-card">
<h2>Tela detalhes do filme id: {moviesId}</h2>
<div className="colunm">
{hasAnyRoles(['ROLE_MEMBER']) && <Evaluation movieId={moviesId}/> ? (
<>
<div className="text-insert-conatiner">
<form onSubmit={handleSubmit(onSubmit)}>
<input
{...register('description')}
className="form-control"
type="text"
placeholder="Deixe sua avaliação aqui"
name="description"
value={formData.description}
onChange={handleChange}
/>
<div className="btn-save-submit">
<ButtonIcon text="SALVAR AVALIAÇÃO" />
</div>
</form>
</div>
</>
):(
<CommentDetails name={formData.name} text={formData.description} />
)}
<div className="movie-details-loader">
<div className="name-container" key={movie?.id}>
<Start /> {formData.name}
<div className="row star-movie-name"></div>
<div className="description-container">
<MovieCard description={formData.description} /> <br />
<CommentDetails name={formData.name} text={formData.description} />
</div>
</div>
</div>
</div>
</div>
</div>
);
};
export default MovieDetails;
Este o código dos cards que estou testando: Comments e Commentsdetails:
import { AxiosRequestConfig } from 'axios';
import CommentDetails from 'components/CommentDetails';
import { useEffect, useState } from 'react';
import { Review } from 'types/review';
import { BASE_URL, requestBackend } from 'util/requests';
import './styles.css';
type Props = {
movieId: string;
};
const Comment = ({ movieId }: Props) => {
const [review, setReview] = useState<Review[]>();
useEffect(() => {
const params: AxiosRequestConfig = {
url: `${BASE_URL}/movies/${movieId}`,
withCredentials: true,
};
requestBackend(params).then((response) => {
setReview(response.data);
});
}, [movieId]);
return (
<div className="base-card comment-card">
{review?.map((item) => (
<div key={item.id}>
<CommentDetails name={item.user.name} text={item.text} />
</div>
))}
</div>
);
};
export default Comment;
E
import { ReactComponent as Star } from 'assets/images/star.svg';
import './styles.css';
type Props = {
name: string;
text: string;
};
const CommentDetails = ({ name, text }: Props) => {
return (
<div className="comment-details-container">
<div className="comment-details-header">
<Star /><h1>{name}</h1>
</div>
<div className="comment-details-card">
<p>{text}</p>
</div>
</div>
);
};
export default CommentDetails;