diff --git a/FE/error/src/components/EconoCalendar.jsx b/FE/error/src/components/EconoCalendar.jsx index 8e52858..2320cac 100644 --- a/FE/error/src/components/EconoCalendar.jsx +++ b/FE/error/src/components/EconoCalendar.jsx @@ -1,48 +1,23 @@ -import { useEffect, useState } from "react"; +import { useState } from "react"; import toast, { Toaster } from "react-hot-toast"; import FullCalendar from "@fullcalendar/react"; import dayGridPlugin from "@fullcalendar/daygrid"; import styled from "styled-components"; import interactionPlugin from "@fullcalendar/interaction"; -import axios from "axios"; import CreateModal from "./scheduleCreate/CreateModal"; import CheckCalendar from "./scheduleCheck/CheckCalendar"; -const EconoCalendar = ({ isLoggedIn, setIsLoggedIn }) => { - const [events, setEvents] = useState([]); +const EconoCalendar = ({ + isLoggedIn, + setIsLoggedIn, + setEvents, + events, + setToken, +}) => { const [selectID, setSelectID] = useState(""); const [checkModalIsOpen, setCheckModalIsOpen] = useState(false); const [createModalIsOpen, setCreateModalIsOpen] = useState(false); const [selectedDate, setSelectedDate] = useState(""); - const [token, setToken] = useState(null); - - useEffect(() => { - const storedToken = localStorage.getItem("slackToken"); - setToken(storedToken); - - const isUserLoggedIn = !!storedToken; - setIsLoggedIn(isUserLoggedIn); - - const uri = isUserLoggedIn - ? "/api/calendar/all" - : "/api/calendar/all/public"; - - axios - .get(uri, { headers: { Authorization: `Bearer ${storedToken}` } }) - .then((res) => { - const fetchedEvents = res.data.data.map((event) => ({ - title: event.eventName, - id: event.eventId, - start: event.eventStartDate.split("T")[0], - end: event.eventEndDate.split("T")[0], - color: "#FFC0CB", - })); - setEvents(fetchedEvents); - }) - .catch((error) => { - console.error("Error fetching events:", error); - }); - }, []); const handleDelete = () => { toast("일정이 삭제되었습니다", { diff --git a/FE/error/src/components/SideBar/individualFilter/IndividualFilter.jsx b/FE/error/src/components/SideBar/individualFilter/IndividualFilter.jsx index c31c60b..c32be69 100644 --- a/FE/error/src/components/SideBar/individualFilter/IndividualFilter.jsx +++ b/FE/error/src/components/SideBar/individualFilter/IndividualFilter.jsx @@ -10,6 +10,7 @@ const IndividualFilter = ({ filterLists, addNewFilter, updateDeleteFilter, + onFilterChange, }) => { const [individualFilterIsOpen, setindividualFilterIsOpen] = useState(false); const [filterListsIsOpen, setFilterListsIsOpen] = useState(true); @@ -69,6 +70,7 @@ const IndividualFilter = ({ )} diff --git a/FE/error/src/pages/MainPage.jsx b/FE/error/src/pages/MainPage.jsx index 69da177..7102b19 100644 --- a/FE/error/src/pages/MainPage.jsx +++ b/FE/error/src/pages/MainPage.jsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from "react"; +import { useState, useEffect, useMemo } from "react"; import styled from "styled-components"; import EconoCalendar from "../components/EconoCalendar"; import ProfileBar from "../components/SideBar/ProfileBar"; @@ -11,6 +11,59 @@ const MainPage = () => { const [filterIndividualLists, setFilterIndividualLists] = useState([]); const [filterGroupLists, setFilterGroupLists] = useState([]); const [isLoggedIn, setIsLoggedIn] = useState(false); + const [events, setEvents] = useState([]); + const [activeFilters, setActiveFilters] = useState(new Set()); + const [token, setToken] = useState(null); + + // 필터링된 이벤트를 계산 + const filteredEvents = useMemo(() => { + if (activeFilters.size === 0) return events; + return events.filter((event) => activeFilters.has(event.filterId)); + }, [events, activeFilters]); + + useEffect(() => { + const storedToken = localStorage.getItem("slackToken"); + setToken(storedToken); + + const isUserLoggedIn = !!storedToken; + setIsLoggedIn(isUserLoggedIn); + + const uri = isUserLoggedIn + ? "/api/calendar/all/private" + : "/api/calendar/all/public"; + + axios + .get(uri, { headers: { Authorization: `Bearer ${storedToken}` } }) + .then((res) => { + const fetchedEvents = res.data.data.map((event) => ({ + title: event.eventName, + id: event.eventId, + start: event.eventStartDate.split("T")[0], + end: event.eventEndDate.split("T")[0], + color: event.filterColor, + filterId: event.filterId, + })); + setEvents(fetchedEvents); + // 모든 필터를 초기에 활성화 + setActiveFilters(new Set(fetchedEvents.map((event) => event.filterId))); + }) + .catch((error) => { + console.error("Error fetching events:", error); + }); + }, []); + + const handleFilterChange = (filterId, isChecked) => { + setActiveFilters((prevFilters) => { + const newFilters = new Set(prevFilters); + if (isChecked) { + newFilters.add(filterId); + } else { + newFilters.delete(filterId); + } + return newFilters; + }); + }; + useEffect(() => { const token = localStorage.getItem("slackToken"); setIsLoggedIn(!!token); @@ -23,29 +76,39 @@ const MainPage = () => { const addNewGroupFilter = (newGroupFilter) => { setFilterGroupLists([...filterGroupLists, newGroupFilter]); }; + const updateDeleteFilter = (newFilter) => { setFilterIndividualLists( filterIndividualLists.filter((filter) => filter.filterId !== newFilter) ); + // 삭제된 필터를 activeFilters에서도 제거 + setActiveFilters((prevFilters) => { + const newFilters = new Set(prevFilters); + newFilters.delete(newFilter); + return newFilters; + }); }; - const storedToken = localStorage.getItem("slackToken"); useEffect(() => { + const storedToken = localStorage.getItem("slackToken"); axios .get("/api/filter", { headers: { Authorization: `Bearer ${storedToken}` }, }) .then((res) => { - console.log(res); const fetchedFilter = res.data.data.map((filter) => ({ filterId: filter.filterId, filterName: filter.filterName, filterColor: filter.filterColor, })); setFilterIndividualLists(fetchedFilter); + // 모든 개인 필터를 초기에 활성화 + setActiveFilters( + new Set(fetchedFilter.map((filter) => filter.filterId)) + ); }) .catch((err) => { - console.log("Error fetching events:", err); + console.log("Error fetching filters:", err); }); }, []); @@ -68,13 +131,20 @@ const MainPage = () => { )} - + ); @@ -82,6 +152,8 @@ const MainPage = () => { export default MainPage; +// ... 나머지 styled-components 코드는 그대로 유지 + const SideBar = styled.div` width: 15.625rem; height: 98.1vh; diff --git a/FE/error/src/utils/filterUtils/FilterList.jsx b/FE/error/src/utils/filterUtils/FilterList.jsx index 33b72f4..c17782a 100644 --- a/FE/error/src/utils/filterUtils/FilterList.jsx +++ b/FE/error/src/utils/filterUtils/FilterList.jsx @@ -3,13 +3,18 @@ import ScheduleToggle from "./ScheduleToggle"; import FilterModify from "./FilterModify"; import FilterDelete from "./FilterDelete"; -const FilterList = ({ filterLists, updateDeleteFilter }) => { +const FilterList = ({ filterLists, updateDeleteFilter, onFilterChange }) => { return ( {filterLists.map((filterList, index) => ( - + {filterList.filterName} diff --git a/FE/error/src/utils/filterUtils/ScheduleToggle.jsx b/FE/error/src/utils/filterUtils/ScheduleToggle.jsx index fe7127c..3e4fa3a 100644 --- a/FE/error/src/utils/filterUtils/ScheduleToggle.jsx +++ b/FE/error/src/utils/filterUtils/ScheduleToggle.jsx @@ -1,11 +1,13 @@ import { useState } from "react"; import styled from "styled-components"; -const ScheduleToggle = ({ color }) => { +const ScheduleToggle = ({ color, id, onToggle }) => { const [clicked, setClicked] = useState(true); - const handleOnClick = () => { - setClicked(!clicked); + const newClickedState = !clicked; + setClicked(newClickedState); + + onToggle(id, newClickedState); }; return (