Source

pages/Dashboard/Announcement/Announcement.jsx

import React, { useState } from "react";
import "../Announcement/announcement.css";
import LoadingAnimation from "../Loading/LoadingAnimation";
import {NavLink, useRoutes} from "react-router-dom";
import AnnouncementCard from "./AnnouncementCard";
import { useGetAnnouncements } from "../../../apis/Announcements";
import { useMemo } from "react";
/**
 * A page that shows all the announcements
 * @namespace Announcement
 * @module Announcement
 * @returns {React.Component}
 * */

const Announcement = () => {
  /**
   * state to show either grid view or list view
   * @type {boolean}
   * @memberof module:Announcement
   * @name gridView
   * */
  const [gridView, setGridView] = useState(true);
  /**
   *
   * state to show filter dropdown
   * @type {boolean}
   * @memberof module:Announcement
   * @name filterDropdown
   */
  const [filterDropdown, setFilterDropdown] = useState(false);
  /**
   *
   * state to show search input
   * @type {string}
   * @memberof module:Announcement
   * @name searchInput
   */
  const [searchInput, setSearchInput] = useState("");
  /**
   *
   * state to show sort by
   * @type {string}
   * @memberof module:Announcement
   * @name sortBy
   */
  const [sortBy, setSortBy] = useState("");
  /**
   *
   * react query hook to get announcements
   * @type {object}
   * @memberof module:Announcement
   * @name useGetAnnouncements
   */
  const { data: announcements, isLoading } = useGetAnnouncements();
  /**
   *
   * announcement list to show
   * @type {Array.<object>}
   * @memberof module:Announcement
   * @name announcementList
   */
  const announcementList = useMemo(() => {
    const temp = announcements?.data?.data?.results || [];
    if (searchInput) {
      const filteredList = temp.filter((item) =>
        item.title.toLowerCase().includes(searchInput.toLowerCase())
      );
      return filteredList.reverse();
    }
    switch (sortBy) {
      case "OLD":
        return [...temp].reverse();
      case "RECENT":
        return temp;
    }
    return temp;
  }, [announcements?.data, searchInput, sortBy]);

  /**
   * function to get selected view
   * @function getSelectedView
   * @returns {JSX.Element}
   */
  const getSelectedView = () => {
    return (
      <div className="announcement_div">
        {gridView ? (
          <div className="documents_divfor_grid_view">
            {announcementList.map((dat, i) => {
              const text = dat.announcement_content;
              return (
                <div className="individual_announcement_card" key={i}>
                  <NavLink
                    to={`/dashboard/announcement/announcementdetail/${dat.id}`}
                  >
                    <div className="announcement_wrapper"></div>
                  </NavLink>
                  <div className="announcement_card_footer">
                    <div className="announcement_card_footer_content">
                      <div className="announcement_add_to_calander">
                        <small>{dat?.created}</small>
                      </div>
                      <div className="announcement_content_section">
                        <ion-icon name="megaphone-outline"></ion-icon>
                        <h4>{dat?.title}</h4>
                        {/* <div className="announcement_content">
                          {
                            <p
                              className="clamped-text"
                              dangerouslySetInnerHTML={{ __html: text }}
                            />
                          }
                        </div> */}
                      </div>
                    </div>
                  </div>
                </div>
              );
            })}
          </div>
        ) : (
          <>
            <div className="list_container">
              {announcementList.map((dat, i) => {
                return (
                  <NavLink
                    to={`/dashboard/announcement/announcementdetail/${dat.id}`}
                  >
                    <AnnouncementCard dat={dat} />
                  </NavLink>
                );
              })}
            </div>
          </>
        )}
      </div>
    );
  };

  if (isLoading) {
    return <LoadingAnimation />;
  }
  return (
    <div className="announcement_container">
      <div className="announcement_heading">
        <h2 className="main-title">Announcements</h2>
        <div className="announcement_search">
          <div className="left_announcement_search">
            <div className="announcement_search_input">
              <ion-icon name="search-outline"></ion-icon>
              <input
                type="text"
                onChange={(e) => setSearchInput(e.target.value)}
                placeholder="Search"
              />
            </div>
          </div>
          <div className="left_announcement_search">
            <ion-icon name="search"></ion-icon>
          </div>
          <div className="right_announcement_search">
            <div className="announcement_grid_list_view">
              <ul>
                {gridView ? (
                  <li
                    onClick={() => setGridView(!gridView)}
                    style={{
                      background: "#53BF8A",
                      borderRadius: ".2rem",
                      color: "#ffffff",
                    }}
                  >
                    <ion-icon name="grid-outline"></ion-icon>
                  </li>
                ) : (
                  <li onClick={() => setGridView(!gridView)}>
                    <ion-icon name="grid-outline"></ion-icon>
                  </li>
                )}
                {gridView ? (
                  <li onClick={() => setGridView(!gridView)}>
                    <ion-icon name="list-outline"></ion-icon>
                  </li>
                ) : (
                  <li
                    onClick={() => setGridView(!gridView)}
                    style={{
                      background: "#53BF8A",
                      borderRadius: ".2rem",
                      color: "#ffffff",
                    }}
                  >
                    <ion-icon name="list-outline"></ion-icon>
                  </li>
                )}
              </ul>
            </div>
            <div
              className="announcement_filter_div"
              onClick={() => {
                setFilterDropdown(!filterDropdown);
              }}
            >
              <p>Sort by</p>
              {filterDropdown ? (
                <ion-icon name="chevron-up-outline"></ion-icon>
              ) : (
                <ion-icon name="chevron-down-outline"></ion-icon>
              )}
              {filterDropdown && (
                <div className="announcement_filter_dropdown">
                  <p onClick={() => setSortBy("RECENT")}>Recent</p>
                  <p onClick={() => setSortBy("OLD")}>Oldest</p>
                </div>
              )}
            </div>
          </div>
        </div>
      </div>
      <div className="navigation_for_mobile">
        <div className="left_mobile_navigation">
          <input
            type="text"
            placeholder="search"
            onChange={(e) => setSearchInput(e.target.value)}
          />
          <ion-icon name="search-outline"></ion-icon>
        </div>
        <div className="right_mobile_navigation">
          <ul>
            <li>
              <ion-icon name="options"></ion-icon>
            </li>
          </ul>
        </div>
      </div>
      <div className="announcement_body mt-3">
        {announcementList.length === 0 ? (
          <div className="empty_announcement_container">
            <div className="announcement_logo">
              <ion-icon name="megaphone-outline"></ion-icon>
              <h3>No Announcements added yet</h3>
              <div className="add_new_announcement">
                <p>
                  Exciting announcements are on the horizon. Stay tuned and be
                  the first to know.
                </p>
              </div>
            </div>
          </div>
        ) : (
          getSelectedView()
        )}
      </div>
    </div>
  );
};

export default Announcement;