From 0685262c1ae7e59b1675b13cc45ec71d0d76cb0e Mon Sep 17 00:00:00 2001 From: Gustavo S Frehse <gsf20@inf.ufpr.br> Date: Tue, 15 Apr 2025 15:03:55 -0300 Subject: [PATCH] isloggedin fix for zustand store --- src/app/colecao/[id]/page.js | 19 +++----- src/app/components/AcessibilityBar.js | 8 ++-- src/app/components/Header.js | 26 +++++------ src/app/components/MenuProfile.js | 9 ++-- src/app/components/NavigationBar.js | 20 ++++----- src/app/components/Notifications.js | 10 ++--- src/app/components/Overlay.js | 3 +- src/app/components/SideBar.js | 17 +++---- src/app/components/loginModal.js | 44 +++++++++++++++++++ src/app/components/needLoginModal.js | 6 +-- src/app/editar/[id]/page.js | 4 +- src/app/handlers/loginHandler.js | 15 +++---- src/app/layout.js | 2 + .../[id]/components/ReportProfileModal.js | 3 -- .../[id]/components/SelectionButtons.js | 4 +- src/app/perfil/[id]/components/UserCard.js | 7 +-- src/app/perfil/[id]/page.js | 5 ++- .../recurso/[id]/components/actionButtons.js | 30 +++++++------ .../recurso/[id]/components/collectModal.js | 5 ++- .../recurso/[id]/components/collectionInfo.js | 6 ++- src/app/recurso/[id]/components/comments.js | 8 ++-- .../[id]/components/complaintsModal.js | 7 ++- .../recurso/[id]/components/createComments.js | 24 +++++----- .../[id]/components/relatedResources.js | 2 +- .../recurso/[id]/components/reportModal.js | 6 ++- src/app/recurso/[id]/page.js | 32 ++++---------- src/app/stores/loginModalStore.js | 10 +++++ src/app/stores/userStore.js | 11 ++++- 28 files changed, 190 insertions(+), 153 deletions(-) create mode 100644 src/app/components/loginModal.js create mode 100644 src/app/stores/loginModalStore.js diff --git a/src/app/colecao/[id]/page.js b/src/app/colecao/[id]/page.js index 4ef56f1b..b533af3d 100644 --- a/src/app/colecao/[id]/page.js +++ b/src/app/colecao/[id]/page.js @@ -1,11 +1,9 @@ "use client"; import { useEffect, useState } from "react"; import Overlay from "@/app/components/Overlay"; -import { isLoggedIn } from "@/app/handlers/loginHandler"; import mecredApi from "@/axiosConfig"; import { getStoredValue } from "@/app/handlers/localStorageHandler"; import Loading from "@/app/components/Loading"; -import NeedLoginModal from "@/app/components/needLoginModal"; import ErrorComponent from "@/app/components/ErrorComponent"; import CollectionPreview from "@/app/components/collectionPreview"; import Tags from "@/app/components/tags"; @@ -13,13 +11,15 @@ import CollectionItems from "./components/collectionItems"; import PublisherInfoCollection from "./components/publisherInfoCollection"; import DownloadButton from "@/app/components/DownloadButton"; import ShareButton from "@/app/components/ShareButton"; +import { useUserStore } from "@/app/stores/userStore"; export default function Colecao({ params }) { const [collection, setCollection] = useState(undefined); - const [needLoginOpen, setNeedLoginOpen] = useState(false); const [error, setError] = useState(false); const [isSmallScreen, setIsSmallScreen] = useState(false); + const userStore = useUserStore(); + const token = getStoredValue("access_token"); const client = getStoredValue("client"); const uid = getStoredValue("uid"); @@ -29,14 +29,8 @@ export default function Colecao({ params }) { try { let headers = {}; - if (isLoggedIn()) { - headers = { - "access-token": token, - "token-type": "Bearer", - client: client, - uid: uid, - Expires: 0, - }; + if (userStore.isLoggedIn()) { + headers = userStore.headers(); } const response = await mecredApi.get(`collections/${params.id}`); @@ -48,7 +42,7 @@ export default function Colecao({ params }) { }; fetchData(); - }, [params.id, client, token, uid]); + }, [params.id, client, token, uid, userStore]); useEffect(() => { // Função para checar o tamanho da tela @@ -73,7 +67,6 @@ export default function Colecao({ params }) { ) ) : ( <> - <NeedLoginModal open={needLoginOpen} setOpen={setNeedLoginOpen} /> <div className="mb-5 overflow-y-auto scrollbar-none"> <div className="bg-ice-HC-dark p-3 w-full"> <div className=" flex justify-center"> diff --git a/src/app/components/AcessibilityBar.js b/src/app/components/AcessibilityBar.js index f16f511b..93c8c2d8 100644 --- a/src/app/components/AcessibilityBar.js +++ b/src/app/components/AcessibilityBar.js @@ -6,7 +6,7 @@ import { useRef, useLayoutEffect } from 'react'; import { useRouter } from 'next/navigation'; import { FaArrowCircleUp } from "react-icons/fa"; import { toggleContrast } from './themeUtils'; -import { isLoggedIn } from "@/app/handlers/loginHandler"; +import { useUserStore } from '../stores/userStore'; export default function AcessibilityBar() { @@ -16,6 +16,7 @@ export default function AcessibilityBar() { const router = useRouter(); const pathname = usePathname() + const userStore = useUserStore(); function goHeader() { window.scrollTo({ @@ -24,7 +25,6 @@ export default function AcessibilityBar() { }); } - function changeFont(action) { sizes.forEach(size => { @@ -178,7 +178,7 @@ export default function AcessibilityBar() { 3- Ir para a busca. </button> - {!isLoggedIn() && + {!userStore.isLoggedIn() && <button onClick={() => router.push("/entrar")}> 4- Ir para login. </button> @@ -223,7 +223,7 @@ export default function AcessibilityBar() { 1- Ir para o conteúdo. </button> - {!isLoggedIn() && + {!userStore.isLoggedIn() && <button onClick={() => router.push("/entrar")}> 2- Ir para login. </button> diff --git a/src/app/components/Header.js b/src/app/components/Header.js index 7ae1eaf4..ebb74533 100644 --- a/src/app/components/Header.js +++ b/src/app/components/Header.js @@ -8,33 +8,32 @@ import MenuIcon from "@mui/icons-material/Menu"; import SearchIcon from "@mui/icons-material/Search"; import AccountMenu from "./MenuProfile"; import SearchComponent from "./SearchComponent"; -import NeedLoginModal from "./needLoginModal"; -import { isLoggedIn, useLoginBarrier } from "@/app/handlers/loginHandler"; import { usePathname } from "next/navigation"; import { useRouter } from "next/navigation"; import { ImArrowLeft } from "react-icons/im"; import Notifications from "./Notifications"; import { toggleContrast } from './themeUtils'; import ContrastTwoToneIcon from '@mui/icons-material/ContrastTwoTone'; +import { useUserStore } from "../stores/userStore"; +import { useLoginBarrier } from "../handlers/loginHandler"; +import { useLoginModalStore } from "../stores/loginModalStore"; function DefaultContent({ handleToggleMobileSearch, - setNeedLoginOpen, setFilterState, filterState }) { const pathname = usePathname(); const router = useRouter(); + const userStore = useUserStore(); const loginBarrier = useLoginBarrier(); - const [loggedIn, setLoggedIn] = useState(false); + const loginModalStore = useLoginModalStore(); - useEffect(() => { - setLoggedIn(isLoggedIn()); - }, []) + console.log("user store header", userStore); const handleOpenSubmit = () => { - if (!isLoggedIn()) { - setNeedLoginOpen(true); + if (!userStore.isLoggedIn()) { + loginModalStore.setOpen(true); } else { const params = new URLSearchParams(); params.set("redirect", pathname); @@ -94,7 +93,7 @@ function DefaultContent({ <ContrastTwoToneIcon className=" text-darkGray-HC-white md:hidden w-[25px] h-[25px]"/> </button> - {loggedIn ? ( + {userStore.isLoggedIn() ? ( <> <Notifications /> @@ -104,7 +103,9 @@ function DefaultContent({ <button type="button" className="group bg-orange-HC-white hover:bg-darkOrange-HC-dark px-4 h-10 mr-14 max-sm:ml-2 rounded text-white-HC-dark-underline flex items-center font-bold flex-shrink-0 hover:text-white-HC-underline outline outline-1 outline-ice-HC-white" - onClick={loginBarrier} + onClick={() => { + loginBarrier() + }} > Entrar </button> @@ -140,7 +141,6 @@ export function MobileSearch({ setFilterState, filterState, handleToggleMobileSe * @returns header */ export default function Header({ setFilterState, filterState, mobileSearch }) { - const [needLoginOpen, setNeedLoginOpen] = useState(false); const [mobileSearchOpen, setMobileSearchOpen] = useState(false); // Função para alternar a exibição da pesquisa no mobile @@ -158,13 +158,11 @@ export default function Header({ setFilterState, filterState, mobileSearch }) { ) : ( <DefaultContent handleToggleMobileSearch={handleToggleMobileSearch} - setNeedLoginOpen={setNeedLoginOpen} setFilterState={setFilterState} filterState={filterState} /> )} </div> - <NeedLoginModal open={needLoginOpen} setOpen={setNeedLoginOpen} /> </div> ); } diff --git a/src/app/components/MenuProfile.js b/src/app/components/MenuProfile.js index a4fa7f39..a8403805 100644 --- a/src/app/components/MenuProfile.js +++ b/src/app/components/MenuProfile.js @@ -11,7 +11,6 @@ import { getStoredValue, removeFromLocalStorage, } from "../handlers/localStorageHandler"; -import { isLoggedIn } from "../handlers/loginHandler"; import AccountCircleRoundedIcon from '@mui/icons-material/AccountCircleRounded'; import SettingsRoundedIcon from '@mui/icons-material/SettingsRounded'; import PrivacyTipRoundedIcon from '@mui/icons-material/PrivacyTipRounded'; @@ -20,6 +19,7 @@ import AccessibilityNewRoundedIcon from '@mui/icons-material/AccessibilityNewRou import FeedbackRoundedIcon from '@mui/icons-material/FeedbackRounded'; import EmailRoundedIcon from '@mui/icons-material/EmailRounded'; import { mecredURL } from "@/axiosConfig"; +import { useUserStore } from "../stores/userStore"; const items = [ // { @@ -82,17 +82,16 @@ export default function AccountMenu() { const [anchorEl, setAnchorEl] = useState(null); const [userData, setUserData] = useState({}); const [id, setId] = useState(null); - const [logged, setLogged] = useState(false); const open = Boolean(anchorEl); + const userStore = useUserStore(); const router = useRouter(); useEffect(() => { - if (isLoggedIn()) { + if (userStore.isLoggedIn()) { let data = JSON.parse(getStoredValue("user_data")); setId(data["id"]); } - setLogged(isLoggedIn()); }, []); const handleClick = (event) => { @@ -123,7 +122,7 @@ export default function AccountMenu() { return ( <> - {logged ? ( + {userStore.isLoggedIn() ? ( <Box className="mr-14 flex align-center"> <IconButton onClick={handleClick} diff --git a/src/app/components/NavigationBar.js b/src/app/components/NavigationBar.js index 47b0a794..c87cbdb2 100644 --- a/src/app/components/NavigationBar.js +++ b/src/app/components/NavigationBar.js @@ -1,7 +1,5 @@ import * as React from 'react'; import { useState, useEffect } from 'react'; -import NeedLoginModal from './needLoginModal'; -import { isLoggedIn } from "../handlers/loginHandler"; import FileUploadIcon from '@mui/icons-material/FileUpload'; import CollectionsBookmarkIcon from "@mui/icons-material/CollectionsBookmark"; import SubjectIcon from "@mui/icons-material/Subject"; @@ -16,18 +14,20 @@ import { getStoredValue, removeFromLocalStorage, } from "../handlers/localStorageHandler"; +import { useLoginModalStore } from '../stores/loginModalStore'; +import { useUserStore } from '../stores/userStore'; export default function NavigationBar({ mobileSearch}) { - - const [needLoginOpen, setNeedLoginOpen] = useState(false); const pathname = usePathname(); let searchParams = useSearchParams(); const page = searchParams.get('page'); const [id, setId] = useState(null); + const loginModalStore = useLoginModalStore(); + const userStore = useUserStore(); useEffect(() => { - if (isLoggedIn()) { + if (userStore.isLoggedIn()) { let data = JSON.parse(getStoredValue("user_data")); setId(data["id"]); } @@ -35,9 +35,9 @@ export default function NavigationBar({ mobileSearch}) { const handleOpenLoggin = (e) => { - if (!isLoggedIn()) { + if (!userStore.isLoggedIn()) { e.preventDefault(); - setNeedLoginOpen(true); + loginModalStore.setOpen(true); } }; @@ -70,8 +70,6 @@ export default function NavigationBar({ mobileSearch}) { return ( <> - <NeedLoginModal open={needLoginOpen} setOpen={setNeedLoginOpen} /> - <nav className="bg-lightGray h-50 outline outline-1 outline-ice-HC-white text-darkGray-HC-white font-light fixed bottom-0 left-0 w-full z-10"> <ul className="flex justify-between overflow-x-auto no-scrollbar animate-scrollHint"> {navItems.map((item, index) => { @@ -89,8 +87,8 @@ export default function NavigationBar({ mobileSearch}) { <li key={index} className="flex w-20 flex-col items-center justify-center p-3"> <a href={isLogout ? "#" : ( - isPublishRoute ? (isLoggedIn() ? "/publicar" : "") : - isPerfilRoute ? (isLoggedIn() ? `/perfil/${id}` : "") : + isPublishRoute ? (userStore.isLoggedIn() ? "/publicar" : "") : + isPerfilRoute ? (userStore.isLoggedIn() ? `/perfil/${id}` : "") : item.href )} onClick={ diff --git a/src/app/components/Notifications.js b/src/app/components/Notifications.js index 080fb428..1d665542 100644 --- a/src/app/components/Notifications.js +++ b/src/app/components/Notifications.js @@ -1,22 +1,22 @@ import mecredApi from "@/axiosConfig"; -import { useLoginBarrier } from "@/app/handlers/loginHandler"; import { getStoredValue } from "@/app/handlers/localStorageHandler"; import { useEffect, useState } from 'react' import ModalNotifications from "./ModalNotifications"; +import { useUserStore } from "../stores/userStore"; export default function Notifications() { const [notifications, setNotifications] = useState([]); const [countNotifications, setCountNotifications] = useState(null); - - const loginBarrier = useLoginBarrier() + const userStore = useUserStore(); const token = getStoredValue("access_token") const client = getStoredValue("client") const uid = getStoredValue("uid") useEffect(() => { - if (!loginBarrier()) + if (!userStore.isLoggedIn()) return + const url = `/feed?offset=0&limit=30` const getNotifications = async (url) => { @@ -43,7 +43,7 @@ export default function Notifications() { //chama funcao getNotifications(url) - }, [loginBarrier, uid, client, token]) + }, [userStore, uid, client, token]) const postViewNotification = async (payload) => { diff --git a/src/app/components/Overlay.js b/src/app/components/Overlay.js index 610bb3dc..e75d2414 100644 --- a/src/app/components/Overlay.js +++ b/src/app/components/Overlay.js @@ -2,12 +2,13 @@ import * as React from "react"; import Header from "./Header"; import SideBar from "./SideBar"; -import { Suspense, useEffect, useLayoutEffect, useState } from "react"; +import { Suspense, useEffect, useState } from "react"; import theme from "@/app/theme"; import { ThemeProvider } from "@emotion/react"; import Loading from "./Loading"; import AcessibilityBar from "./AcessibilityBar"; import NavigationBar from "./NavigationBar"; +import { useUserStore } from "../stores/userStore"; /** * @param {Object} props diff --git a/src/app/components/SideBar.js b/src/app/components/SideBar.js index c49cc1dd..2d4d9e52 100644 --- a/src/app/components/SideBar.js +++ b/src/app/components/SideBar.js @@ -10,11 +10,11 @@ import VerifiedIcon from "@mui/icons-material/Verified"; import { usePathname, useSearchParams } from "next/navigation"; import { Person } from "@mui/icons-material"; import FileUploadIcon from '@mui/icons-material/FileUpload'; -import { isLoggedIn } from "../handlers/loginHandler"; -import NeedLoginModal from "./needLoginModal"; import { getStoredValue, } from "../handlers/localStorageHandler"; +import { useLoginModalStore } from "../stores/loginModalStore"; +import { useUserStore } from "../stores/userStore"; /** * @param {Object} props @@ -108,20 +108,16 @@ export default function SideBar({ setFilterState, filterState }) { } }; - const [needLoginOpen, setNeedLoginOpen] = useState(false); - + const userStore = useUserStore(); + const setOpenLoginModal = useLoginModalStore(store => store.setOpen); const handleOpenLogin = () => { - - if (!isLoggedIn()) { - setNeedLoginOpen(true); - } }; const [id, setId] = useState(null); useEffect(() => { - if (isLoggedIn()) { + if (false) { let data = JSON.parse(getStoredValue("user_data")); setId(data["id"]); } @@ -129,7 +125,6 @@ export default function SideBar({ setFilterState, filterState }) { return ( <> - <NeedLoginModal open={needLoginOpen} setOpen={setNeedLoginOpen} /> <div className="max-md:hidden min-h-0 overflow-y-auto flex flex-col text-darkGray-HC-white-underline font-light"> <div className="flex flex-col justify-start items-center gap-3 w-full "> @@ -137,7 +132,7 @@ export default function SideBar({ setFilterState, filterState }) { return ( <Link onClick={item.href === "/publicar" ? handleOpenLogin : () => { }} - href={item.href === "/publicar" ? (isLoggedIn() ? "/publicar" : "") : getHref(item.href)} + href={item.href === "/publicar" ? (userStore.isLoggedIn() ? "/publicar" : "") : getHref(item.href)} key={index} alt={item.title} title={item.title} diff --git a/src/app/components/loginModal.js b/src/app/components/loginModal.js new file mode 100644 index 00000000..20ac89c7 --- /dev/null +++ b/src/app/components/loginModal.js @@ -0,0 +1,44 @@ +"use client" +import { Button } from "@mui/material" +import { useLoginModalStore } from "../stores/loginModalStore" +import { useUserStore } from "../stores/userStore"; + +export default function LoginModal() { + const loginModalStore = useLoginModalStore(); + const userStore = useUserStore(); + + console.log(loginModalStore); + + if (!loginModalStore.open) { + return null; + } + + + return ( + <div className="fixed inset-16"> + <div className="flex flex-col rounded-lg bg-white-HC-dark p-3"> + <div className="text-xl text-darkGray-HC-white-underline font-bold ">Entrar</div> + <div className="p-3"> + <div className="text-base text-darkGray-HC-white-underline"> + Você precisa entrar ou se cadastrar para executar essa ação. + </div> + <div className="flex flex-wrap justify-center gap-1 items-stretch"> + <Button + variant="contained" + className="bg-turquoise hover:bg-[#1d1d1d1c] disabled:bg-red mt-3 text-white-HC-dark-underline hover:text-turquoise-HC-underline shadow-none rounded normal-case text-base font-bold flex-shrink-0 flex-grow" + > + Ir para página de Login + </Button> + <Button + variant="contained" + className="bg-white-HC-dark hover:bg-[#1d1d1d1c] disabled:bg-red mt-3 text-turquoise-HC-underline hover:text-turquoise-HC-underline shadow-none rounded normal-case text-base font-bold flex-shrink-0 flex-grow" + onClick={() => loginModalStore.setOpen(false)} + > + Cancelar + </Button> + </div> + </div> + </div> + </div> + ) +} \ No newline at end of file diff --git a/src/app/components/needLoginModal.js b/src/app/components/needLoginModal.js index adf5c7e5..9082c586 100644 --- a/src/app/components/needLoginModal.js +++ b/src/app/components/needLoginModal.js @@ -1,13 +1,13 @@ import { Button, Modal } from "@mui/material"; -import { isLoggedIn, useLoginBarrier } from "@/app/handlers/loginHandler"; +import { useUserStore } from "../stores/userStore"; export default function NeedLoginModal({ open, setOpen }) { - const loginBarrier = useLoginBarrier(); + const userStore = useUserStore(); return ( <> <Modal - open={open && isLoggedIn} + open={open && userStore.isLoggedIn()} className="grid h-screen place-items-center m-5" onClose={() => setOpen(false)} slotProps={{ diff --git a/src/app/editar/[id]/page.js b/src/app/editar/[id]/page.js index a9a984d5..e437c053 100644 --- a/src/app/editar/[id]/page.js +++ b/src/app/editar/[id]/page.js @@ -16,8 +16,8 @@ export default function Edit({ params }) { const [got, setGot] = useState(false) useEffect(() => { - if (!loginBarrier()) - return + loginBarrier(); + const fetchUser = async (id) => { await mecredApi .get(`/users/${id}`, { diff --git a/src/app/handlers/loginHandler.js b/src/app/handlers/loginHandler.js index 95813076..d881556d 100644 --- a/src/app/handlers/loginHandler.js +++ b/src/app/handlers/loginHandler.js @@ -1,10 +1,10 @@ import { redirect, usePathname, useSearchParams } from "next/navigation"; import { useRouter } from "next/navigation"; -import { useCallback } from "react"; +import { useCallback, useEffect } from "react"; import { getStoredValue } from "./localStorageHandler"; +import { useUserStore } from "../stores/userStore"; export function isLoggedIn() { - return false; if (typeof window === "undefined") return undefined; return getStoredValue("access_token") ? true : false; @@ -12,18 +12,17 @@ export function isLoggedIn() { /** * React Hook for forcing login. Redirects to login page and when user logs in redirects back to the original page. - * For example, doing `const loginBarrier = useLoginBarrier()` then calling `loginBarrier()` will redirect to login page if - * the user is not logged in. * - * @returns Function that will force login. + * @returns Hook that will force login. */ -export function useLoginBarrier(originalPath) { +export function useLoginBarrier() { const pathname = usePathname(); const searchParams = useSearchParams(); const router = useRouter(); + const userStore = useUserStore(); return useCallback(() => { - if (isLoggedIn()) return true; + if (userStore.isLoggedIn()) return true; const params = new URLSearchParams(); params.set("redirect", pathname); @@ -31,5 +30,5 @@ export function useLoginBarrier(originalPath) { router.push(`/entrar?${params.toString()}`); return false; - }, [router, pathname, searchParams]); + }, [router, pathname, searchParams, userStore]); } \ No newline at end of file diff --git a/src/app/layout.js b/src/app/layout.js index 20faac14..38e91ef1 100644 --- a/src/app/layout.js +++ b/src/app/layout.js @@ -1,6 +1,7 @@ import { Suspense } from "react"; import "./globals.css"; import Loading from "./components/Loading"; +import LoginModal from "./components/loginModal"; export const metadata = { title: 'MECRED', @@ -19,6 +20,7 @@ export default function RootLayout({ children }) { <body> <Suspense fallback={<Loading />}> {children} + <LoginModal /> </Suspense> </body> </html> diff --git a/src/app/perfil/[id]/components/ReportProfileModal.js b/src/app/perfil/[id]/components/ReportProfileModal.js index d56afb51..3db76c64 100644 --- a/src/app/perfil/[id]/components/ReportProfileModal.js +++ b/src/app/perfil/[id]/components/ReportProfileModal.js @@ -2,7 +2,6 @@ import { Button, FormControl, FormControlLabel, - FormLabel, Modal, Radio, RadioGroup, @@ -12,8 +11,6 @@ import { import { useState, useEffect } from "react"; import { getStoredValue } from "@/app/handlers/localStorageHandler"; import mecredApi from "@/axiosConfig"; -import { isLoggedIn } from "@/app/handlers/loginHandler"; -import { useRouter } from "next/navigation"; const options = [ { value: "6", text: 'Esta pessoa está fingindo ser eu ou alguém que eu conheço.' }, diff --git a/src/app/perfil/[id]/components/SelectionButtons.js b/src/app/perfil/[id]/components/SelectionButtons.js index e4cfa8e8..dcadf62a 100644 --- a/src/app/perfil/[id]/components/SelectionButtons.js +++ b/src/app/perfil/[id]/components/SelectionButtons.js @@ -1,6 +1,4 @@ -import Grid from "@mui/material/Grid" -import { isLoggedIn } from '@/app/handlers/loginHandler'; -import { Divider, Tab, Tabs } from "@mui/material"; +import { Tab, Tabs } from "@mui/material"; import { useState } from "react"; /** diff --git a/src/app/perfil/[id]/components/UserCard.js b/src/app/perfil/[id]/components/UserCard.js index a5251ea8..b1beddd5 100644 --- a/src/app/perfil/[id]/components/UserCard.js +++ b/src/app/perfil/[id]/components/UserCard.js @@ -7,7 +7,6 @@ import { Avatar } from '@mui/material'; import { useEffect, useState } from 'react'; import { getStoredValue } from '@/app/handlers/localStorageHandler'; import mecredApi, { mecredURL } from '@/axiosConfig'; -import { isLoggedIn } from '@/app/handlers/loginHandler'; import Stats from './Stats'; import MedalAchievements from './MedalAchievements'; import AboutCard from "./AboutCard"; @@ -18,6 +17,7 @@ import FollowingCards from "./FollowingCards"; import FollowersCards from "./FollowersCards"; import ProfileComplaints from "./ProfileComplaints"; import ProfileAchievementsMenu from "./ProfileAchievementsMenu"; +import { useUserStore } from '@/app/stores/userStore'; const roles = [ { @@ -106,13 +106,14 @@ export default function UserCard({ profileData, idLogin, achievements, progresse const [translateItems, setTranslateItems] = useState("") const [optButton, setOptButton] = useState(0) const [verifyCurator, setVerifyCurator] = useState(false) + const userStore = useUserStore(); /** * faz fetch dos seguidores e seguindo, se não estiver logado não aparece essa informação */ useEffect(() => { - if (!isLoggedIn) + if (!userStore.isLoggedIn()) return; const fetchFollowers = async () => { const token = getStoredValue("access_token") @@ -184,7 +185,7 @@ export default function UserCard({ profileData, idLogin, achievements, progresse */ let options = [{ name: "Sobre", component: <AboutCard content={profileData["description"]} /> }] - if (isLoggedIn() && profileData["id"] == idLogin) { + if (userStore.isLoggedIn() && profileData["id"] == idLogin) { options.push({ name: "Conquistas", component: <ProfileAchievementsMenu profileData={profileData} achievements={achievements} progresses={progresses} setItems={setItems} items={items} store={store} /> }, { name: "Meus Recursos", component: <ProfileResources id={profileData["id"]} idLogin={idLogin} /> }, diff --git a/src/app/perfil/[id]/page.js b/src/app/perfil/[id]/page.js index 431cb8d6..a6bf80d0 100644 --- a/src/app/perfil/[id]/page.js +++ b/src/app/perfil/[id]/page.js @@ -4,8 +4,8 @@ import { getStoredValue } from "../../handlers/localStorageHandler"; import { useEffect, useState } from "react"; import Overlay from "../../components/Overlay"; import mecredApi from "@/axiosConfig"; -import { isLoggedIn } from "@/app/handlers/loginHandler"; import ErrorComponent from "@/app/components/ErrorComponent"; +import { useUserStore } from "@/app/stores/userStore"; export default function Perfil({ params }) { const [profileData, setProfileData] = useState(null); @@ -15,6 +15,7 @@ export default function Perfil({ params }) { const [progresses, setProgresses] = useState(null); const [error, setError] = useState(false) const [idLogin, setIdLogin] = useState(0) + const userStore = useUserStore(); const token = getStoredValue("access_token") const client = getStoredValue("client") const uid = getStoredValue("uid") @@ -64,7 +65,7 @@ export default function Perfil({ params }) { fetchItems(params.id) - if (isLoggedIn()) { + if (userStore.isLoggedIn()) { let data = getStoredValue("user_data") let dataJson = JSON.parse(data); diff --git a/src/app/recurso/[id]/components/actionButtons.js b/src/app/recurso/[id]/components/actionButtons.js index 4ee38dc5..39ca6c65 100644 --- a/src/app/recurso/[id]/components/actionButtons.js +++ b/src/app/recurso/[id]/components/actionButtons.js @@ -9,15 +9,16 @@ import DeleteOutlinedIcon from '@mui/icons-material/DeleteOutlined'; import FlagOutlinedIcon from "@mui/icons-material/FlagOutlined"; import FlagIcon from "@mui/icons-material/Flag"; import mecredApi, { mecredURL } from "@/axiosConfig"; -import { isLoggedIn, useLoginBarrier } from "@/app/handlers/loginHandler"; import { getStoredValue } from "@/app/handlers/localStorageHandler"; -import { useState, useEffect, useLayoutEffect } from "react"; +import { useState, useEffect } from "react"; import ShareModal from "../../../components/ShareModal"; import ReportModal from "./reportModal"; import CollectModal from "./collectModal"; import HomologationModal from "./homologationModal"; import DeleteModal from "./deleteModal"; import { usePathname } from "next/navigation"; +import { useLoginModalStore } from "@/app/stores/loginModalStore"; +import { useUserStore } from "@/app/stores/userStore"; function ChangeOnHover({ text, textOnHover }) { return ( @@ -28,7 +29,7 @@ function ChangeOnHover({ text, textOnHover }) { ); } -export default function ActionButtons({ learningObject, setNeedLoginOpen, state }) { +export default function ActionButtons({ learningObject, state }) { const [liked, setLiked] = useState(learningObject.liked); const [shareOpen, setShareOpen] = useState(false); const [reportOpen, setReportOpen] = useState(false); @@ -39,13 +40,16 @@ export default function ActionButtons({ learningObject, setNeedLoginOpen, state const [deleteOpen, setDeleteOpen] = useState(false) const [submitted, setSubmitted] = useState(state) + const loginModalStore = useLoginModalStore(); + const userStore = useUserStore(); + const token = getStoredValue("access_token"); const client = getStoredValue("client"); const uid = getStoredValue("uid"); const pathname = usePathname(); useEffect(() => { - if (!isLoggedIn()) return; + if (!userStore.isLoggedIn()) return; const data = JSON.parse(getStoredValue("user_data")); setUserData(data); @@ -56,7 +60,7 @@ export default function ActionButtons({ learningObject, setNeedLoginOpen, state }, [learningObject.liked, userData]); useEffect(() => { - if(!isLoggedIn() || !learningObject?.id) return; + if(!userStore.isLoggedIn() || !learningObject?.id) return; setReported(learningObject.complained); }, [learningObject]) @@ -101,8 +105,8 @@ export default function ActionButtons({ learningObject, setNeedLoginOpen, state ), icon: liked ? <FavoriteOutlinedIcon /> : <FavoriteBorderOutlinedIcon />, action: () => { - if (!isLoggedIn()) { - setNeedLoginOpen(true); + if (!userStore.isLoggedIn()) { + loginModalStore.setOpen(true); return; } @@ -127,8 +131,8 @@ export default function ActionButtons({ learningObject, setNeedLoginOpen, state // Botão de Colecionar { name: "Colecionar", icon: <BookmarkBorderOutlinedIcon />, action: () => { - if (!isLoggedIn()) { - setNeedLoginOpen(true); + if (!userStore.isLoggedIn()) { + loginModalStore.setOpen(true); return; } setCollectOpen(true) @@ -148,8 +152,8 @@ export default function ActionButtons({ learningObject, setNeedLoginOpen, state name: reported ? "Reportado" : "Reportar", icon: reported ? <FlagIcon /> : <FlagOutlinedIcon />, action: () => { - if (!isLoggedIn()) { - setNeedLoginOpen(true); + if (!userStore.isLoggedIn()) { + loginModalStore.setOpen(true); return; } if (reported) return; @@ -163,8 +167,8 @@ export default function ActionButtons({ learningObject, setNeedLoginOpen, state name: "Deletar", icon: <DeleteOutlinedIcon />, action: () => { - if (!isLoggedIn()) { - setNeedLoginOpen(true); + if (!userStore.isLoggedIn()) { + loginModalStore.setOpen(true); return; } diff --git a/src/app/recurso/[id]/components/collectModal.js b/src/app/recurso/[id]/components/collectModal.js index 0e594d2e..5f0dae7e 100644 --- a/src/app/recurso/[id]/components/collectModal.js +++ b/src/app/recurso/[id]/components/collectModal.js @@ -4,8 +4,8 @@ import { useEffect, useState } from "react" import { getStoredValue } from "@/app/handlers/localStorageHandler" import LockIcon from '@mui/icons-material/Lock'; import LockOpenIcon from '@mui/icons-material/LockOpen'; -import { isLoggedIn } from "@/app/handlers/loginHandler"; import CreateCollectionModal from "@/app/perfil/[id]/components/CreateCollectionModal"; +import { useUserStore } from "@/app/stores/userStore"; /** * @@ -22,13 +22,14 @@ export default function CollectModal({ open, onClose, idLogin, resourceId }) { const [repeatedOpen, setRepeatedOpen] = useState(false) const [sucessOpen, setSucessOpen] = useState(false) const [collectionOpen, setCollectionOpen] = useState(false) + const userStore = useUserStore(); const token = getStoredValue("access_token"); const client = getStoredValue("client"); const uid = getStoredValue("uid"); useEffect(() => { - if (!isLoggedIn()) return; + if (!userStore.isLoggedIn()) return; /** * Fetch do número total de coleções do usuário diff --git a/src/app/recurso/[id]/components/collectionInfo.js b/src/app/recurso/[id]/components/collectionInfo.js index 62d25ab6..2a1c696e 100644 --- a/src/app/recurso/[id]/components/collectionInfo.js +++ b/src/app/recurso/[id]/components/collectionInfo.js @@ -1,15 +1,17 @@ import { useEffect, useRef, useState } from "react"; import { getStoredValue } from "@/app/handlers/localStorageHandler"; import { useMediaQuery } from "@mui/material"; -import { isLoggedIn } from "@/app/handlers/loginHandler"; import Loading from "@/app/components/Loading"; import mecredApi from "@/axiosConfig"; import Cards from "@/app/components/Cards"; import Link from "next/link"; +import { useUserStore } from "@/app/stores/userStore"; export default function CollectionInfo({ resourceId, collectionId }) { const [collection, setCollection] = useState(null); + const userStore = useUserStore(); + const token = getStoredValue("access_token"); const client = getStoredValue("client"); const uid = getStoredValue("uid"); @@ -18,7 +20,7 @@ export default function CollectionInfo({ resourceId, collectionId }) { const fetchData = async () => { let headers = {}; - if (isLoggedIn()) { + if (userStore.isLoggedIn()) { headers = { "access-token": token, "token-type": "Bearer", diff --git a/src/app/recurso/[id]/components/comments.js b/src/app/recurso/[id]/components/comments.js index fb956258..1ab035d8 100644 --- a/src/app/recurso/[id]/components/comments.js +++ b/src/app/recurso/[id]/components/comments.js @@ -4,14 +4,14 @@ import mecredApi from "@/axiosConfig"; import { getStoredValue } from "@/app/handlers/localStorageHandler"; import PrintComments from "./printComments"; import CreateComments from "./createComments"; -import { isLoggedIn } from "@/app/handlers/loginHandler"; -import { setConfig } from "next/config"; import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; +import { useUserStore } from "@/app/stores/userStore"; export default function Comments({ learningObjectId }) { const [comments, setComments] = useState(null) const [newComment, setNewComment] = useState(""); + const userStore = useUserStore(); const token = getStoredValue("access_token") const client = getStoredValue("client") @@ -21,12 +21,12 @@ export default function Comments({ learningObjectId }) { const [logged, setLogged] = useState(false); useEffect(() => { - if (!isLoggedIn()) return; + if (!userStore.isLoggedIn()) return; const data = JSON.parse(getStoredValue("user_data")); setUserData(data); setLogged(true); - }, [token]) + }, [token, userStore]) const handleSubmitComment = async () => { diff --git a/src/app/recurso/[id]/components/complaintsModal.js b/src/app/recurso/[id]/components/complaintsModal.js index b76bef23..86fa428e 100644 --- a/src/app/recurso/[id]/components/complaintsModal.js +++ b/src/app/recurso/[id]/components/complaintsModal.js @@ -3,14 +3,17 @@ import { getStoredValue } from "@/app/handlers/localStorageHandler"; import mecredApi from "@/axiosConfig"; import { Alert, FormControlLabel, Modal, Radio, RadioGroup, TextField } from "@mui/material"; import { useEffect, useState } from "react"; -import { isLoggedIn } from "@/app/handlers/loginHandler"; import CloseIcon from '@mui/icons-material/Close'; +import { useUserStore } from "@/app/stores/userStore"; export default function ComplaintModal({ open, onClose, name, id, setSubmitted }) { const [questions, setQuestions] = useState([]) const [payload, setPayload] = useState([]) const [myId, setMyId] = useState(null); const [message, setMessage] = useState("") + + const userStore = useUserStore(); + const token = getStoredValue("access_token"); const client = getStoredValue("client"); const uid = getStoredValue("uid"); @@ -26,7 +29,7 @@ export default function ComplaintModal({ open, onClose, name, id, setSubmitted } }, []) useEffect(() => { - if (isLoggedIn()) { + if (userStore.isLoggedIn()) { let data = JSON.parse(getStoredValue("user_data")); setMyId(data["id"]); } diff --git a/src/app/recurso/[id]/components/createComments.js b/src/app/recurso/[id]/components/createComments.js index d3e1aafe..13b2f12c 100644 --- a/src/app/recurso/[id]/components/createComments.js +++ b/src/app/recurso/[id]/components/createComments.js @@ -1,11 +1,10 @@ import { Avatar, TextareaAutosize } from "@mui/material" import PersonIcon from '@mui/icons-material/Person'; -import { useEffect, useState } from "react"; -import mecredApi, { mecredURL } from "@/axiosConfig"; -import { getStoredValue } from "@/app/handlers/localStorageHandler"; -import NeedLoginModal from "../../../components/needLoginModal"; +import { mecredURL } from "@/axiosConfig"; import SendIcon from '@mui/icons-material/Send'; +import { useUserStore } from "@/app/stores/userStore"; +import { useLoginModalStore } from "@/app/stores/loginModalStore"; function getRandomBg(id) { const colors = [ @@ -27,13 +26,11 @@ function getRandomBg(id) { return colors[id % colors.length]; } - - - export default function CreateComments({ user, logged, handleSubmitComment, newComment, setNewComment, comments, setComments }) { - const handleInputChange = (e) => setNewComment(e.target.value); - const [needLoginOpen, setNeedLoginOpen] = useState(false) + const handleInputChange = (e) => setNewComment(e.target.value); + const userStore = useUserStore(); + const loginModalStore = useLoginModalStore(); return ( <div> @@ -73,7 +70,8 @@ export default function CreateComments({ user, logged, handleSubmitComment, newC <div className="flex justify-end gap-2 mt-2"> <button className="w-24 h-8 border-black rounded-lg text-darkGray-HC-white-underline text-sm hover:text-white-HC-dark-underline hover:bg-ice-HC-white outline outline-1 outline-ice-HC-white" onClick={() => setNewComment("")}> cancelar </button> <button className="bg-turquoise-HC-white hover:bg-darkTurquoise-HC-dark hover:text-white w-24 h-8 rounded-lg text-white-HC-dark-underline text-sm hover:bg-turquoise-hover outline outline-1 outline-ice-HC-white" onClick={() => { - if (!logged) setNeedLoginOpen(true) + if (!userStore.isLoggedIn()) + loginModalStore.setOpen(true); handleSubmitComment() }}> comentar </button> </div> @@ -96,14 +94,12 @@ export default function CreateComments({ user, logged, handleSubmitComment, newC }} /> <button onClick={() => { - if (!logged) setNeedLoginOpen(true) + if (!userStore.isLoggedIn()) + loginModalStore.setOpen(true); handleSubmitComment() - }}><SendIcon className="text-turquoise-HC-underline " /></button> </div> </div> - <NeedLoginModal open={needLoginOpen} setOpen={setNeedLoginOpen} /> - </div > ) } \ No newline at end of file diff --git a/src/app/recurso/[id]/components/relatedResources.js b/src/app/recurso/[id]/components/relatedResources.js index 6a96b0e6..922e42c0 100644 --- a/src/app/recurso/[id]/components/relatedResources.js +++ b/src/app/recurso/[id]/components/relatedResources.js @@ -46,7 +46,7 @@ export default function RelatedResources({ learningObject }) { - const isSm = useMediaQuery((theme) => theme.breakpoints.down('sm')); + const isSm = false;// useMediaQuery((theme) => theme.breakpoints.down('sm')); return ( <Loading loaded={got}> diff --git a/src/app/recurso/[id]/components/reportModal.js b/src/app/recurso/[id]/components/reportModal.js index d03444bc..95ac68ae 100644 --- a/src/app/recurso/[id]/components/reportModal.js +++ b/src/app/recurso/[id]/components/reportModal.js @@ -10,7 +10,7 @@ import { import { useState, useEffect } from "react"; import { getStoredValue } from "@/app/handlers/localStorageHandler"; import mecredApi from "@/axiosConfig"; -import { isLoggedIn } from "@/app/handlers/loginHandler"; +import { useUserStore } from "@/app/stores/userStore"; const ModalSucess = ({ open, onClose, modalOnClose }) => { @@ -43,12 +43,14 @@ export default function ReportModal({ open, onClose, learningObject, setReported const [user, setUser] = useState({}); const [submitOpen, setSubmitOpen] = useState(false); + const userStore = useUserStore(); + const token = getStoredValue("access_token"); const client = getStoredValue("client"); const uid = getStoredValue("uid"); useEffect(() => { - if (!isLoggedIn()) + if (!userStore.isLoggedIn()) return; const userData = JSON.parse(getStoredValue("user_data")); diff --git a/src/app/recurso/[id]/page.js b/src/app/recurso/[id]/page.js index 7e49c096..a60f765c 100644 --- a/src/app/recurso/[id]/page.js +++ b/src/app/recurso/[id]/page.js @@ -6,22 +6,19 @@ import PublisherInfo from "../../components/publisherInfo"; import Overlay from "../../components/Overlay"; import ResourceInfo from "./components/resourceInfo"; import RelatedResources from "./components/relatedResources"; -import { isLoggedIn } from "@/app/handlers/loginHandler"; import mecredApi from "@/axiosConfig"; -import { getStoredValue } from "@/app/handlers/localStorageHandler"; import Loading from "@/app/components/Loading"; import ResourcePreview from "./components/resourcePreview"; -import NeedLoginModal from "../../components/needLoginModal"; import ErrorComponent from "@/app/components/ErrorComponent"; import HomologationModal from "./components/homologationModal"; import ComplaintModal from "./components/complaintsModal"; import Comments from "./components/comments"; import { useSearchParams } from "next/navigation"; import CollectionInfo from "./components/collectionInfo"; +import { useUserStore } from "@/app/stores/userStore"; export default function Recurso({ params }) { const [learningObject, setLearningObject] = useState(undefined); - const [needLoginOpen, setNeedLoginOpen] = useState(false); const [error, setError] = useState(false); const [state, setState] = useState(); const [submitOpen, setSubmitOpen] = useState(false); @@ -29,30 +26,20 @@ export default function Recurso({ params }) { const [complained, setComplained] = useState(); const [isSmallScreen, setIsSmallScreen] = useState(false); const searchParams = useSearchParams(); + const userStore = useUserStore(); const collectionId = searchParams.get("collectionId"); - const token = getStoredValue("access_token"); - const client = getStoredValue("client"); - const uid = getStoredValue("uid"); - useEffect(() => { const fetchData = async () => { try { - let headers = {}; - - if (isLoggedIn()) { - headers = { - "access-token": token, - "token-type": "Bearer", - client: client, - uid: uid, - Expires: 0, - }; + let response = null; + if (userStore.isLoggedIn()) { + response = await mecredApi.get(`api/resource/${params.id}`, { headers: userStore.headers() }); + } else { + response = await mecredApi.get(`public/resource/${params.id}`); } - const response = await mecredApi.get(`learning_objects/${params.id}`, { headers }); - setLearningObject(response.data); setState(response.data.state === "submitted"); setComplained(response.data.state === "suspended"); @@ -62,7 +49,7 @@ export default function Recurso({ params }) { }; fetchData(); - }, [params.id, client, token, uid]); + }, [params.id]); useEffect(() => { setComplained(learningObject?.state === "suspended"); @@ -92,7 +79,6 @@ export default function Recurso({ params }) { <> <HomologationModal open={submitOpen} onClose={() => setSubmitOpen(false)} name={learningObject.name} id={learningObject.submission_id} setSubmitted={setState} /> <ComplaintModal open={submitComplaintOpen} onClose={() => setSubmitComplaintOpen(false)} name={learningObject.name} id={learningObject.id} setSubmitted={setComplained} /> - <NeedLoginModal open={needLoginOpen} setOpen={setNeedLoginOpen} /> <div className="flex flex-col bg-ice-HC-dark p-3 flex-shrink-0 min-height-0 overflow-y-auto scrollbar-none scroll-container"> <div className=" flex justify-center"> <ResourcePreview learningObject={learningObject} /> @@ -128,7 +114,7 @@ export default function Recurso({ params }) { </div> )} </div> - <ActionButtons learningObject={learningObject} setNeedLoginOpen={setNeedLoginOpen} state={state} /> + <ActionButtons learningObject={learningObject} state={state} /> <PublisherInfo publisher={learningObject?.publisher} /> <ResourceInfo learningObject={learningObject} /> <Comments learningObjectId={params.id} /> diff --git a/src/app/stores/loginModalStore.js b/src/app/stores/loginModalStore.js new file mode 100644 index 00000000..0f108121 --- /dev/null +++ b/src/app/stores/loginModalStore.js @@ -0,0 +1,10 @@ +import { create } from 'zustand'; + +const useLoginModalStore = create((set) => ({ + open: false, + setOpen: (open) => { + set({ open }) + } +})) + +export { useLoginModalStore }; diff --git a/src/app/stores/userStore.js b/src/app/stores/userStore.js index 26be6a4b..21ec96a4 100644 --- a/src/app/stores/userStore.js +++ b/src/app/stores/userStore.js @@ -1,7 +1,8 @@ +import mecredApi from '@/axiosConfig'; import { create } from 'zustand'; const useUserStore = create((set, get) => ({ - token: localStorage.getItem('token') || null, + token: null, data: null, error: null, setToken: (token) => { @@ -10,10 +11,16 @@ const useUserStore = create((set, get) => ({ }, clearToken: () => { localStorage.removeItem('token'); - set({ token: null }) + set({ token: null }); }, headers: () => { return { 'Authorization': `Bearer ${get().token}` }; + }, + fetchUser: () => { + mecredApi.get('/api', get().headers()); + }, + isLoggedIn: () => { + return get().token !== null; } })) -- GitLab