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