diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 714e3a7..3bc6766 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -13,6 +13,7 @@ import { QueryClient, QueryClientProvider } from "react-query"; import PrivateRoute from "./components/PrivateRoute/PrivateRoute"; import { ToastContainer } from "react-toastify"; import "react-toastify/dist/ReactToastify.css"; +import Polls from "./pages/Polls"; function App() { const queryClient = new QueryClient(); @@ -25,6 +26,7 @@ function App() { } /> } /> } /> + } /> }> } /> } /> diff --git a/frontend/src/components/Header/Header.jsx b/frontend/src/components/Header/Header.jsx index f6f03a7..0c3e2ce 100644 --- a/frontend/src/components/Header/Header.jsx +++ b/frontend/src/components/Header/Header.jsx @@ -1,26 +1,37 @@ -import React from 'react' -import { Link } from 'react-router-dom' -import useUserStore from '../../store/useStore' -import ProfileImage from './ProfileImage'; +import React from "react"; +import { Link } from "react-router-dom"; +import useUserStore from "../../store/useStore"; +import ProfileImage from "./ProfileImage"; function Header() { - - const {user} = useUserStore(); + const { user } = useUserStore(); return (
-
- LivePoll -
-
-
    - {user.username ?
  • Dashboard
  • :
  • Login
  • } -
  • Bookmarks
  • -
-
- {user.username && } -
- ) +
+ + LivePoll + +
+
+
    + {user.username ? ( +
  • + Dashboard +
  • + ) : ( +
  • + Login +
  • + )} +
  • + Polls +
  • +
+
+ {user.username && } + + ); } -export default Header +export default Header; diff --git a/frontend/src/components/Header/ProfileImage.jsx b/frontend/src/components/Header/ProfileImage.jsx index 8b74525..1e28653 100644 --- a/frontend/src/components/Header/ProfileImage.jsx +++ b/frontend/src/components/Header/ProfileImage.jsx @@ -29,6 +29,9 @@ function ProfileImage({userData}) { Profile New + + Bookmarks +
  • Logout
  • diff --git a/frontend/src/components/PollCard/PollCard.jsx b/frontend/src/components/PollCard/PollCard.jsx new file mode 100644 index 0000000..59ad26a --- /dev/null +++ b/frontend/src/components/PollCard/PollCard.jsx @@ -0,0 +1,28 @@ +import React from "react"; +import { useNavigate } from "react-router-dom"; + +function PollCard({ poll }) { + + const navigator = useNavigate(); + + const handleViewOnClick = () => { + navigator(`/view/${poll._id}`); + }; + + return ( +
    +
    +

    {poll.title}

    +

    {poll.description}

    +
    +
    + Created by {poll.creatorData.username} on {new Date(poll?.createdAt).toLocaleDateString()} +
    + +
    +
    +
    + ); +} + +export default PollCard; diff --git a/frontend/src/pages/Polls.jsx b/frontend/src/pages/Polls.jsx new file mode 100644 index 0000000..bd5a006 --- /dev/null +++ b/frontend/src/pages/Polls.jsx @@ -0,0 +1,38 @@ +import React, { useState } from 'react' +import { useQuery } from 'react-query' +import getPollsService from '../services/getPollsService' +import PollCard from '../components/PollCard/PollCard' +import ErrorFallback from '../components/Errors/ErrorFallback' + +function Polls() { + + const [page, setPage] = useState(1); + const [limit, setLimit] = useState(6); + + const {data, isLoading, isError, isSuccess, refetch} = useQuery(["polls", page, limit], () => getPollsService(page, limit), { + cacheTime: 1000 * 60 * 5, // 5 minutes + staleTime: 1000 * 60 * 10, // 10 minutes + }) + + return ( +
    +

    Polls

    + {isSuccess &&
    + {data?.data?.polls?.map((poll) => ( + + ))} +
    } + {isLoading &&
    } + {isError &&
    + refetch()} /> +
    } + +
    + + +
    +
    + ) +} + +export default Polls diff --git a/frontend/src/services/getPollsService.js b/frontend/src/services/getPollsService.js new file mode 100644 index 0000000..1f41047 --- /dev/null +++ b/frontend/src/services/getPollsService.js @@ -0,0 +1,8 @@ +import axiosInstance from "../helper/axiosInstance"; + +async function getPollsService(page = 1, limit = 10) { + const response = await axiosInstance.get(`poll/all?page=${page}&limit=${limit}`); + return response.data; +} + +export default getPollsService; \ No newline at end of file