Showing
4 changed files
with
46 additions
and
21 deletions
| ... | @@ -4,14 +4,19 @@ import "../styles/Side.css"; | ... | @@ -4,14 +4,19 @@ import "../styles/Side.css"; |
| 4 | import SideSubject from "./SideSubject"; | 4 | import SideSubject from "./SideSubject"; |
| 5 | 5 | ||
| 6 | const Side = () => { | 6 | const Side = () => { |
| 7 | - const { subs, setSubs } = useContext(CalendarStateContext); | 7 | + const { subsObj, dispatch } = useContext(CalendarStateContext); |
| 8 | 8 | ||
| 9 | const renderSubs = () => { | 9 | const renderSubs = () => { |
| 10 | const sideSubjects = []; | 10 | const sideSubjects = []; |
| 11 | 11 | ||
| 12 | - for (let i = 0; i < subs.length; i++) { | 12 | + for (const code in subsObj) { |
| 13 | sideSubjects.push( | 13 | sideSubjects.push( |
| 14 | - <SideSubject key={i} subject={subs[i]} setSubs={setSubs} /> | 14 | + <SideSubject |
| 15 | + key={code} | ||
| 16 | + code={code} | ||
| 17 | + subject={subsObj[code]} | ||
| 18 | + dispatch={dispatch} | ||
| 19 | + /> | ||
| 15 | ); | 20 | ); |
| 16 | } | 21 | } |
| 17 | 22 | ... | ... |
| 1 | -const SideSubject = ({ subject }) => { | 1 | +const SideSubject = ({ code, subject, dispatch }) => { |
| 2 | - let isChecked = false; | ||
| 3 | const defaultColor = "#EFEFEF"; | 2 | const defaultColor = "#EFEFEF"; |
| 4 | - const bgc = "background-color"; | ||
| 5 | 3 | ||
| 6 | const check = (e) => { | 4 | const check = (e) => { |
| 7 | - if (isChecked) e.target.style["background-color"] = defaultColor; | 5 | + dispatch({ type: "CHECKED", code }); |
| 6 | + if (subject.selected) e.target.style["background-color"] = defaultColor; | ||
| 8 | else e.target.style["background-color"] = subject.color; | 7 | else e.target.style["background-color"] = subject.color; |
| 9 | - isChecked = !isChecked; | ||
| 10 | }; | 8 | }; |
| 11 | 9 | ||
| 12 | return ( | 10 | return ( |
| ... | @@ -15,7 +13,7 @@ const SideSubject = ({ subject }) => { | ... | @@ -15,7 +13,7 @@ const SideSubject = ({ subject }) => { |
| 15 | className="ssc" | 13 | className="ssc" |
| 16 | onClick={check} | 14 | onClick={check} |
| 17 | style={{ | 15 | style={{ |
| 18 | - [bgc]: isChecked ? subject.color : defaultColor, | 16 | + backgroundColor: subject.selected ? subject.color : defaultColor, |
| 19 | }} | 17 | }} |
| 20 | ></div> | 18 | ></div> |
| 21 | 19 | ... | ... |
| ... | @@ -5,7 +5,7 @@ import App from "./App"; | ... | @@ -5,7 +5,7 @@ import App from "./App"; |
| 5 | 5 | ||
| 6 | const root = ReactDOM.createRoot(document.getElementById("root")); | 6 | const root = ReactDOM.createRoot(document.getElementById("root")); |
| 7 | root.render( | 7 | root.render( |
| 8 | - <React.StrictMode> | 8 | + // <React.StrictMode> |
| 9 | - <App /> | 9 | + <App /> |
| 10 | - </React.StrictMode> | 10 | + // </React.StrictMode> |
| 11 | ); | 11 | ); | ... | ... |
| 1 | -import React, { useState } from "react"; | 1 | +import React, { useReducer, useState } from "react"; |
| 2 | import { Navigate, Route, Routes } from "react-router-dom"; | 2 | import { Navigate, Route, Routes } from "react-router-dom"; |
| 3 | 3 | ||
| 4 | import Month from "../components/Month"; | 4 | import Month from "../components/Month"; |
| 5 | import Header from "../components/Header"; | 5 | import Header from "../components/Header"; |
| 6 | import Side from "../components/Side"; | 6 | import Side from "../components/Side"; |
| 7 | -import Subject from "../utils/Subject"; | ||
| 8 | 7 | ||
| 9 | export const CalendarStateContext = React.createContext(); | 8 | export const CalendarStateContext = React.createContext(); |
| 10 | 9 | ||
| 10 | +const render = (subsObj, args) => { | ||
| 11 | + switch (args.type) { | ||
| 12 | + case "CHECKED": | ||
| 13 | + const sub = subsObj[args.code]; | ||
| 14 | + sub.selected = !sub.selected; | ||
| 15 | + localStorage.setItem("S" + args.code, JSON.stringify(sub)); | ||
| 16 | + return { ...subsObj, [args.code]: sub }; | ||
| 17 | + default: | ||
| 18 | + return subsObj; | ||
| 19 | + } | ||
| 20 | +}; | ||
| 21 | + | ||
| 11 | const Calendar = () => { | 22 | const Calendar = () => { |
| 12 | console.log("visit Calendar"); | 23 | console.log("visit Calendar"); |
| 13 | 24 | ||
| ... | @@ -18,8 +29,9 @@ const Calendar = () => { | ... | @@ -18,8 +29,9 @@ const Calendar = () => { |
| 18 | date: new Date(), | 29 | date: new Date(), |
| 19 | }); | 30 | }); |
| 20 | 31 | ||
| 32 | + let subLst; | ||
| 21 | if (!localStorage.getItem("Subjects")) { | 33 | if (!localStorage.getItem("Subjects")) { |
| 22 | - let tsubs = []; | 34 | + subLst = []; |
| 23 | let tcolors = [ | 35 | let tcolors = [ |
| 24 | "red", | 36 | "red", |
| 25 | "green", | 37 | "green", |
| ... | @@ -30,16 +42,26 @@ const Calendar = () => { | ... | @@ -30,16 +42,26 @@ const Calendar = () => { |
| 30 | "chartreuse", | 42 | "chartreuse", |
| 31 | ]; | 43 | ]; |
| 32 | for (let i = 0; i < 7; i++) { | 44 | for (let i = 0; i < 7; i++) { |
| 33 | - tsubs.push(new Subject("과목" + (i + 1), tcolors[i], true)); | 45 | + let code = i + 1; |
| 46 | + let tsub = { name: "과목" + code, color: tcolors[i], selected: true }; | ||
| 47 | + subLst.push(code); | ||
| 48 | + localStorage.setItem("S" + code, JSON.stringify(tsub)); | ||
| 34 | } | 49 | } |
| 35 | - localStorage.setItem("Subjects", JSON.stringify(tsubs)); | 50 | + localStorage.setItem("Subjects", JSON.stringify(subLst)); |
| 36 | } | 51 | } |
| 37 | - const [subs, setSubs] = useState( | 52 | + |
| 38 | - JSON.parse(localStorage.getItem("Subjects")) | 53 | + subLst = JSON.parse(localStorage.getItem("Subjects")); |
| 39 | - ); | 54 | + let tsubsObj = {}; |
| 55 | + for (const code of subLst) { | ||
| 56 | + tsubsObj[code] = JSON.parse(localStorage.getItem("S" + code)); | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + const [subsObj, dispatch] = useReducer(render, tsubsObj); | ||
| 40 | 60 | ||
| 41 | return ( | 61 | return ( |
| 42 | - <CalendarStateContext.Provider value={{ state, setState, subs, setSubs }}> | 62 | + <CalendarStateContext.Provider |
| 63 | + value={{ state, setState, subsObj, dispatch }} | ||
| 64 | + > | ||
| 43 | {session ? ( | 65 | {session ? ( |
| 44 | <div className="Calendar"> | 66 | <div className="Calendar"> |
| 45 | <Header /> | 67 | <Header /> | ... | ... |
-
Please register or login to post a comment