diff --git a/src/app/components/Cards.js b/src/app/components/Cards.js index 5497d7acda2447f1f284fafcc8f0159a50fd423c..e7a94f86c41b977a508886c15ed4d96125bc38f0 100644 --- a/src/app/components/Cards.js +++ b/src/app/components/Cards.js @@ -7,12 +7,14 @@ import Typography from "@mui/material/Typography"; import Link from "next/link"; import { mecredURL } from "@/axiosConfig"; import DeleteOutlinedIcon from '@mui/icons-material/DeleteOutlined'; +import EditOutlinedIcon from "@mui/icons-material/EditOutlined"; import { ImTelegram } from "react-icons/im"; import { isLoggedIn, useLoginBarrier } from "@/app/handlers/loginHandler"; import { useState, useEffect, useLayoutEffect } from "react"; import { getStoredValue } from "@/app/handlers/localStorageHandler"; import DeleteModal from "../recurso/[id]/components/deleteModal"; import { Button } from "@mui/material"; +import { EditResourceModal } from "./EditResourceModal"; /** @@ -28,6 +30,7 @@ import { Button } from "@mui/material"; export default function Cards(props) { const [deleteOpen, setDeleteOpen] = useState(false) + const [editOpen, setEditOpen] = useState(false) const [userData, setUserData] = useState([]) const [userProfile, setUserProfile] = useState(false) @@ -135,6 +138,18 @@ export default function Cards(props) { } let button = [ + { + name: "Editar", + icon: <EditOutlinedIcon />, + action: () => { + if (!isLoggedIn()) { + return; + } + + setEditOpen(true); + }, + extraProps: {}, + }, { name: "Deletar", icon: <DeleteOutlinedIcon />, @@ -143,15 +158,13 @@ export default function Cards(props) { //setNeedLoginOpen(true); return; } - + setDeleteOpen(true); }, extraProps: {}, }, - ] - - - + ]; + return ( <Card className={`active:bg-ice-HC-dark active:rounded-3xl transition ease-in-out 2xl:w-[330px] xl:w-[290px] lg:w-[270px] max-lg:w-[290px] outline outline-1 outline-ice-HC-white ${props.page !== "recurso" && "items-center"}`} @@ -245,6 +258,7 @@ export default function Cards(props) { {userProfile ? <div className="flex justify-end w-full"> <DeleteModal setUniqueResources={props.setUniqueResources} userProfile open={deleteOpen} onClose={() => setDeleteOpen(false)} idLogin={userData["id"]} resourceId={props["id"]} /> + <EditResourceModal open={editOpen} onClose={() => setEditOpen(false)} setEditOpen={setEditOpen} resource={props.resource} /> {button.map((item, index) => ( <div key={index}> <Button diff --git a/src/app/components/EditResourceModal.js b/src/app/components/EditResourceModal.js new file mode 100644 index 0000000000000000000000000000000000000000..f2911930be8b2283ee87efc7eb97fd76492af441 --- /dev/null +++ b/src/app/components/EditResourceModal.js @@ -0,0 +1,153 @@ +import { Button, Modal } from "@mui/material"; +import { useEffect, useState } from "react"; +import FieldLabel from "./FieldLabel"; +import CustomTextField from "../publicar/components/CustomTextField"; +import { getStoredValue } from "../handlers/localStorageHandler"; +import mecredApi from "@/axiosConfig"; + +export function EditResourceModal({ open, onClose, resource, setEditOpen }) { + const [title, setTitle] = useState(""); + const [description, setDescription] = useState(""); + const [openSuccess, setOpenSuccess] = useState(false) + + const token = getStoredValue("access_token"); + const client = getStoredValue("client"); + const uid = getStoredValue("uid"); + + useEffect(() => { + if (resource?.learning_object) { + setTitle(resource.learning_object.name ?? ""); + setDescription(resource.learning_object.description ?? ""); + } + }, [resource]); + + if (!resource?.learning_object) return null; + + const handleTitleChange = (e) => setTitle(e.target.value); + const handleDescriptionChange = (e) => setDescription(e.target.value); + + const fetchData = async () => { + const payload = { + "id": resource?.learning_object.id, + "name": title, + "description": description + } + console.log("aa") + + try { + await mecredApi.put(`/learning_objects/${resource?.learning_object.id}.json`, payload, { + headers: { + "access-token": token, + "token-type": "Bearer", + client: client, + uid: uid, + Expires: 0, + }, + }); + setOpenSuccess(true) + + } catch (error) { + // Tratar erros, se necessário + console.error('Erro ao enviar dados:', error); + } + }; + + const ModalSucess = ({ open, onClose }) => { + return ( + <Modal open={open} onClose={onClose} className="grid place-items-center" + slotProps={{ + backdrop: { + sx: { + backgroundColor: "rgba(0, 0, 0, 0.3)", // Ajuste a opacidade conforme necessário + }, + }, + }}> + <div className="flex flex-col justify-center bg-ice-HC-dark p-5 rounded"> + <p className="text-xl justify-center flex text-darkGray-HC-white-underline mb-2"> + Recurso editado com sucesso! + </p> + <div className="flex flex-row mt-2 justify-center gap-3"> + <button + className="text-sm text-darkGray-HC-white-underline border-main rounded-lg normal-case font-bold bg-ice-HC-dark hover:bg-ice-HC-dark-hover" + onClick={() => onClose()} + > + OK + </button> + </div> + </div> + </Modal> + ); + }; + + return ( + <Modal + open={open} + onClose={onClose} + className="grid place-items-center" + > + <div className="bg-ice-HC-dark p-6 rounded-lg"> + <ModalSucess open={openSuccess} onClose={() => setOpenSuccess(false)}/> + + <div className="flex justify-center mb-4"> + + <p className="text-darkGray-HC-white-underline text-xl font-bold ">Editar recurso</p> + </div> + <FieldLabel + name="Título do Recurso*" + error={(!title)} + /> + <CustomTextField + multiline + fullWidth + value={title} + placeholder={"Ex: Jogo Virtual sobre os Biomas do Brasil"} + onChange={handleTitleChange} + helperText={<div className=" w-full justify-end flex"> + {title.length}/100 + </div>} + error={(title.length > 100) || (!title)} + className="mb-5" + sx={{ + "& .MuiOutlinedInput-input::placeholder": { + color: "var(--darkGray-HC-white)", + opacity: 0.5, + }, + }} + /> + <FieldLabel name="Descrição geral do Recurso*" error={(!description)} /> + <CustomTextField + multiline + rows={5} + fullWidth + value={description} + placeholder={"Quais assuntos são contemplados neste recurso? Para quais objetivos este recurso pode ser destinado?"} + onChange={handleDescriptionChange} + helperText={<div className=" w-full justify-end flex"> + {description.length}/1500 + </div>} + error={(description.length > 1500) || (!description)} + className="mb-5" + /> + <div className="flex w-full justify-end p-3"> + + <Button + onClick={() => { setEditOpen(false) }} + type="button" + variant="text" + className="normal-case w-36 text-base text-darkGray-HC-white-underline font-bold mr-2 outline outline-1 outline-ice-HC-white hover:bg-lightGray-HC-white hover:text-darkGray-HC-dark-underline" + > + Fechar + </Button> + <Button + onClick={() => fetchData()} + type="submit" + className="border-turquoise-HC-white w-36 rounded-lg hover:bg-darkTurquoise-HC-dark bg-turquoise-HC-white text-base text-white-HC-dark-underline hover:text-white-HC-underline font-bold normal-case flex" + variant="outlined" + > + Continuar + </Button> + </div> + </div> + </Modal> + ) +} \ No newline at end of file diff --git a/src/app/components/InfiniteScrollCards.js b/src/app/components/InfiniteScrollCards.js index f1717290d44fa31789c331fea3e6dc2aecc6b0e5..483dfb50fb424639255fefe55f219ff4204c1f2e 100644 --- a/src/app/components/InfiniteScrollCards.js +++ b/src/app/components/InfiniteScrollCards.js @@ -137,7 +137,7 @@ export default function InfiniteScrollCards({ setMecLoading, data, searchClass, avatar={item["publisher"]["avatar"]} image={item["thumbnail"]} type={item["object_type"]} - updated_at={item["updated_at"]} + updated_at={item["created_at"]} /> ))} </div> diff --git a/src/app/perfil/[id]/components/ProfileResources.js b/src/app/perfil/[id]/components/ProfileResources.js index b445709dc9c085292aa5dcf8a8155f27ce099221..7b66a69182a2e7428007e41ae3e67ae58a74a494 100644 --- a/src/app/perfil/[id]/components/ProfileResources.js +++ b/src/app/perfil/[id]/components/ProfileResources.js @@ -156,6 +156,7 @@ export default function ProfileResources({ id, idLogin }) { updated_at={resource?.updated_at || resource.learning_object?.updated_at} homologa={resource?.status} setUniqueResources={setUniqueResources} + resource={resource} /> ))} </div>