From 6f15b9b37071e2f12e304de3e22e31286248df06 Mon Sep 17 00:00:00 2001 From: AnSui22 <ansui218@ewhain.net> Date: Sun, 12 Jan 2025 22:37:13 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20api=20=EB=AA=85=EC=84=B8=EC=84=9C=20?= =?UTF-8?q?=ED=98=95=EC=8B=9D=EC=97=90=20=EB=A7=9E=EC=B6=B0=EC=84=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/PermissionToggle.tsx | 5 +- src/components/RoomEditor.tsx | 102 +++++++++++++++------------- src/components/SelectDate.tsx | 16 ++--- src/context/RoomContext.tsx | 40 +++++++---- src/pages/CreateRoom.tsx | 10 +-- src/pages/EditRoom.tsx | 10 +-- src/utils/LessonDaysList.ts | 14 ++++ src/utils/PermissionList.ts | 16 ++--- src/utils/WeekList.ts | 14 ---- 9 files changed, 122 insertions(+), 105 deletions(-) create mode 100644 src/utils/LessonDaysList.ts delete mode 100644 src/utils/WeekList.ts diff --git a/src/components/PermissionToggle.tsx b/src/components/PermissionToggle.tsx index ac51a4f..9364267 100644 --- a/src/components/PermissionToggle.tsx +++ b/src/components/PermissionToggle.tsx @@ -1,9 +1,10 @@ import { Permission } from '../utils/PermissionList'; +import { SimplePermission } from '../context/RoomContext'; type TypeProps = { permission: Permission; + handleToggleCheck: (id: number, permissionType: keyof SimplePermission) => void; isChecked: boolean; - handleToggleCheck: (id: number, permission: string) => void; }; const PermissionToggle = ({ permission, handleToggleCheck, isChecked }: TypeProps) => { @@ -15,7 +16,7 @@ const PermissionToggle = ({ permission, handleToggleCheck, isChecked }: TypeProp type="checkbox" checked={isChecked} className="hidden" - onChange={() => handleToggleCheck(permission.id, permission.type)} + onChange={() => handleToggleCheck(permission.id, permission.type as keyof SimplePermission)} /> <label htmlFor={`permission-${permission.id}`} diff --git a/src/components/RoomEditor.tsx b/src/components/RoomEditor.tsx index 21b5e29..ad8ccbd 100644 --- a/src/components/RoomEditor.tsx +++ b/src/components/RoomEditor.tsx @@ -1,9 +1,9 @@ -import PermissionToggle from '../components/PermissionToggle'; import SelectDate from '../components/SelectDate'; import { useEffect, useState } from 'react'; -import { OnSubmit, Room } from '../context/RoomContext'; -import { WeekList } from '../utils/WeekList'; +import { OnSubmit, Room, SimpleLessonDay, SimplePermission } from '../context/RoomContext'; +import { LessonDaysList } from '../utils/LessonDaysList'; import { ParentPermissions, StudentPermissions } from '../utils/PermissionList'; +import PermissionToggle from './PermissionToggle'; type EditProps = { currentRoom: Room | undefined; @@ -21,10 +21,23 @@ const RoomEditor = ({ currentRoom, onSubmit }: EditProps) => { roomName: '', studentName: '', subject: '', - days: [''], - parentPermissions: ['counseling', 'payment'], - studentPermissions: ['materials', 'homework', 'stats'], + lessonDays: [] as SimpleLessonDay[], + parentPermissions: { + lecture_file: false, + homework: false, + gradeStatistic: false, + counselingLog: true, + deposit: true, + }, + studentPermissions: { + lecture_file: true, + homework: true, + gradeStatistic: true, + counselingLog: false, + deposit: false, + }, }); + console.log(input); const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => { if (e.target.placeholder === '방이름') setInput((prev) => ({ ...prev, roomName: e.target.value })); @@ -32,47 +45,38 @@ const RoomEditor = ({ currentRoom, onSubmit }: EditProps) => { if (e.target.placeholder === '과목명') setInput((prev) => ({ ...prev, subject: e.target.value })); }; - const handleToggleCheck = (id: number, permission: string) => { + const handleDaysClick = (lessonDay: string) => { + setInput((prev) => { + const newDays = prev.lessonDays.some((d) => d.lessonDay === lessonDay) + ? prev.lessonDays.filter((d) => d.lessonDay !== lessonDay) + : [...prev.lessonDays, { lessonDay }]; + return { ...prev, lessonDays: newDays }; + }); + }; + + const handleToggleCheck = (id: number, permissionType: keyof SimplePermission) => { if (id >= 3 && id <= 7) return; - else if (id < 5) + else if (id < 3) { setInput((prev) => { - const newPermissions = prev.parentPermissions.includes(permission) - ? prev.parentPermissions.filter((p) => p !== permission) - : [...prev.parentPermissions, permission]; - return { - ...prev, - parentPermissions: newPermissions.sort( - (a, b) => - ParentPermissions.find((permission) => permission.type === a)?.id! - - ParentPermissions.find((permission) => permission.type === b)?.id!, - ), - }; + const updatedPermissions = { ...prev.parentPermissions }; + + if (updatedPermissions[permissionType] !== undefined) { + updatedPermissions[permissionType] = !updatedPermissions[permissionType]; + } + + return { ...prev, parentPermissions: updatedPermissions }; }); - else if (id >= 5) + } else if (id > 7) { setInput((prev) => { - const newPermissions = prev.studentPermissions.includes(permission) - ? prev.studentPermissions.filter((p) => p !== permission) - : [...prev.studentPermissions, permission]; - return { - ...prev, - studentPermissions: newPermissions.sort( - (a, b) => - StudentPermissions.find((permission) => permission.type === a)?.id! - - StudentPermissions.find((permission) => permission.type === b)?.id!, - ), - }; - }); - }; + const updatedPermissions = { ...prev.studentPermissions }; - const handleWeekClick = (day: string) => { - setInput((prev) => { - const newDays = prev.days.includes(day) ? prev.days.filter((d) => d !== day) : [...prev.days, day]; - const sortedDays = newDays.sort( - (a, b) => WeekList.find((week) => week.date === a)?.id! - WeekList.find((week) => week.date === b)?.id!, - ); + if (updatedPermissions[permissionType] !== undefined) { + updatedPermissions[permissionType] = !updatedPermissions[permissionType]; + } - return { ...prev, days: sortedDays }; - }); + return { ...prev, studentPermissions: updatedPermissions }; + }); + } }; return ( @@ -81,12 +85,12 @@ const RoomEditor = ({ currentRoom, onSubmit }: EditProps) => { <input placeholder="학생이름" onChange={handleInputChange} value={input.studentName} /> <input placeholder="과목명" onChange={handleInputChange} value={input.subject} /> <div className="flex gap-4 justify-center"> - {WeekList.map((week) => ( + {LessonDaysList.map((lessonDayItem) => ( <SelectDate - key={week.id} - week={week} - isClicked={input.days.includes(week.date)} - handleWeekClick={handleWeekClick} + key={lessonDayItem.id} + lessonDayItem={lessonDayItem} + isClicked={input.lessonDays.find((day) => day.lessonDay === lessonDayItem.lessonDay) !== undefined} + handleDaysClick={handleDaysClick} /> ))} </div> @@ -96,9 +100,9 @@ const RoomEditor = ({ currentRoom, onSubmit }: EditProps) => { {ParentPermissions.map((permission) => ( <PermissionToggle key={permission.id} - isChecked={input.parentPermissions.includes(permission.type)} permission={permission} handleToggleCheck={handleToggleCheck} + isChecked={input.parentPermissions[permission.type as keyof SimplePermission]} /> ))} </div> @@ -107,9 +111,9 @@ const RoomEditor = ({ currentRoom, onSubmit }: EditProps) => { {StudentPermissions.map((permission) => ( <PermissionToggle key={permission.id} - isChecked={input.studentPermissions.includes(permission.type)} permission={permission} handleToggleCheck={handleToggleCheck} + isChecked={input.studentPermissions[permission.type as keyof SimplePermission]} /> ))} </div> @@ -121,7 +125,7 @@ const RoomEditor = ({ currentRoom, onSubmit }: EditProps) => { input.roomName, input.studentName, input.subject, - input.days, + input.lessonDays, input.parentPermissions, input.studentPermissions, ) diff --git a/src/components/SelectDate.tsx b/src/components/SelectDate.tsx index bf21d26..92d2878 100644 --- a/src/components/SelectDate.tsx +++ b/src/components/SelectDate.tsx @@ -1,19 +1,19 @@ -import { Week } from '../utils/WeekList'; +import { LessonDay } from '../utils/LessonDaysList'; -type WeekProps = { - week: Week; +type LessonDayProps = { + lessonDayItem: LessonDay; isClicked: boolean; - handleWeekClick: (day: string) => void; + handleDaysClick: (day: string) => void; }; -const SelectDate = ({ week, isClicked, handleWeekClick }: WeekProps) => { +const SelectDate = ({ lessonDayItem, isClicked, handleDaysClick }: LessonDayProps) => { return ( <div> <button - className={`px-4 text-white ${isClicked ? 'bg-black' : 'bg-gray-300'}`} - onClick={() => handleWeekClick(week.date)} + className={`px-4 text-white ${isClicked ? 'bg-black' : 'bg-gray-300'}`} + onClick={() => handleDaysClick(lessonDayItem.lessonDay)} // lessonDay만 전달 > - {week.date} + {lessonDayItem.lessonDay} </button> </div> ); diff --git a/src/context/RoomContext.tsx b/src/context/RoomContext.tsx index 1a9282d..4c5ac96 100644 --- a/src/context/RoomContext.tsx +++ b/src/context/RoomContext.tsx @@ -1,13 +1,25 @@ import { createContext, ReactNode, useContext, useState, useRef } from 'react'; +export type SimpleLessonDay = { + lessonDay: string; +}; + +export type SimplePermission = { + lecture_file: boolean; + homework: boolean; + gradeStatistic: boolean; + counselingLog: boolean; + deposit: boolean; +}; + export type Room = { id: number; roomName: string; studentName: string; subject: string; - days: string[]; - parentPermissions: string[]; - studentPermissions: string[]; + lessonDays: SimpleLessonDay[]; + parentPermissions: SimplePermission; + studentPermissions: SimplePermission; }; export type OnSubmit = ( @@ -15,9 +27,9 @@ export type OnSubmit = ( roomName: string, studentName: string, subject: string, - days: string[], - parentPermissions: string[], - studentPermissions: string[], + lessonDays: SimpleLessonDay[], + parentPermissions: SimplePermission, + studentPermissions: SimplePermission, ) => void; type RoomContextType = { @@ -46,16 +58,16 @@ export const RoomProvider = ({ children }: { children: ReactNode }) => { roomName: string, studentName: string, subject: string, - days: string[], - parentPermissions: string[], - studentPermissions: string[], + lessonDays: SimpleLessonDay[], + parentPermissions: SimplePermission, + studentPermissions: SimplePermission, ) => { const newRoom: Room = { id: idRef.current++, roomName: roomName, studentName: studentName, subject: subject, - days: days, + lessonDays: lessonDays, parentPermissions: parentPermissions, studentPermissions: studentPermissions, }; @@ -67,16 +79,16 @@ export const RoomProvider = ({ children }: { children: ReactNode }) => { roomName: string, studentName: string, subject: string, - days: string[], - parentPermissions: string[], - studentPermissions: string[], + lessonDays: SimpleLessonDay[], + parentPermissions: SimplePermission, + studentPermissions: SimplePermission, ) => { const updatedRoom: Room = { id: id, roomName: roomName, studentName: studentName, subject: subject, - days: days, + lessonDays: lessonDays, parentPermissions: parentPermissions, studentPermissions: studentPermissions, }; diff --git a/src/pages/CreateRoom.tsx b/src/pages/CreateRoom.tsx index 72b08fc..8c41a26 100644 --- a/src/pages/CreateRoom.tsx +++ b/src/pages/CreateRoom.tsx @@ -1,6 +1,6 @@ import RoomEditor from '../components/RoomEditor'; import { useState } from 'react'; -import { Room, useRoomContext } from '../context/RoomContext'; +import { Room, useRoomContext, SimpleLessonDay, SimplePermission } from '../context/RoomContext'; import { useNavigate } from 'react-router-dom'; const CreateRoom = () => { @@ -13,11 +13,11 @@ const CreateRoom = () => { roomName: string, studentName: string, subject: string, - days: string[], - parentPermissions: string[], - studentPermissions: string[], + lessonDays: SimpleLessonDay[], + parentPermissions: SimplePermission, + studentPermissions: SimplePermission, ) => { - onCreate(id, roomName, studentName, subject, days, parentPermissions, studentPermissions); + onCreate(id, roomName, studentName, subject, lessonDays, parentPermissions, studentPermissions); navigate('/user/roomlist'); }; diff --git a/src/pages/EditRoom.tsx b/src/pages/EditRoom.tsx index 26e8674..81ed4b0 100644 --- a/src/pages/EditRoom.tsx +++ b/src/pages/EditRoom.tsx @@ -1,5 +1,5 @@ import { useNavigate, useParams } from 'react-router-dom'; -import { Room, useRoomContext } from '../context/RoomContext'; +import { Room, useRoomContext, SimpleLessonDay, SimplePermission } from '../context/RoomContext'; import { useEffect, useState } from 'react'; import RoomEditor from '../components/RoomEditor'; @@ -26,11 +26,11 @@ const EditRoom = () => { roomName: string, studentName: string, subject: string, - days: string[], - parentPermissions: string[], - studentPermissions: string[], + lessonDays: SimpleLessonDay[], + parentPermissions: SimplePermission, + studentPermissions: SimplePermission, ) => { - onUpdate(paramsId, roomName, studentName, subject, days, parentPermissions, studentPermissions); + onUpdate(paramsId, roomName, studentName, subject, lessonDays, parentPermissions, studentPermissions); navigate('/user/roomlist'); }; diff --git a/src/utils/LessonDaysList.ts b/src/utils/LessonDaysList.ts new file mode 100644 index 0000000..51f97ef --- /dev/null +++ b/src/utils/LessonDaysList.ts @@ -0,0 +1,14 @@ +export interface LessonDay { + id: number; + lessonDay: string; +} + +export const LessonDaysList: LessonDay[] = [ + { id: 0, lessonDay: '월' }, + { id: 1, lessonDay: '화' }, + { id: 2, lessonDay: '수' }, + { id: 3, lessonDay: '목' }, + { id: 4, lessonDay: '금' }, + { id: 5, lessonDay: '토' }, + { id: 6, lessonDay: '일' }, +]; diff --git a/src/utils/PermissionList.ts b/src/utils/PermissionList.ts index 2e8b9de..5026890 100644 --- a/src/utils/PermissionList.ts +++ b/src/utils/PermissionList.ts @@ -5,17 +5,17 @@ export interface Permission { } export const ParentPermissions: Permission[] = [ - { id: 0, type: 'materials', title: '강의 자료함' }, + { id: 0, type: 'lecture_file', title: '강의 자료함' }, { id: 1, type: 'homework', title: '주차별 숙제' }, - { id: 2, type: 'stats', title: '성적 통계' }, - { id: 3, type: 'counseling', title: '상담 일지' }, //true - { id: 4, type: 'payment', title: '입금' }, //true + { id: 2, type: 'gradeStatistic', title: '성적 통계' }, + { id: 3, type: 'counselingLog', title: '상담 일지' }, //true + { id: 4, type: 'deposit', title: '입금' }, //true ]; export const StudentPermissions: Permission[] = [ - { id: 5, type: 'materials', title: '강의 자료함' }, //true + { id: 5, type: 'lecture_file', title: '강의 자료함' }, //true { id: 6, type: 'homework', title: '주차별 숙제' }, //true - { id: 7, type: 'stats', title: '성적 통계' }, //true - { id: 8, type: 'counseling', title: '상담 일지' }, - { id: 9, type: 'payment', title: '입금' }, + { id: 7, type: 'gradeStatistic', title: '성적 통계' }, //true + { id: 8, type: 'counselingLog', title: '상담 일지' }, + { id: 9, type: 'deposit', title: '입금' }, ]; diff --git a/src/utils/WeekList.ts b/src/utils/WeekList.ts deleted file mode 100644 index 26c3600..0000000 --- a/src/utils/WeekList.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface Week { - id: number; - date: string; -} - -export const WeekList: Week[] = [ - { id: 0, date: '월' }, - { id: 1, date: '화' }, - { id: 2, date: '수' }, - { id: 3, date: '목' }, - { id: 4, date: '금' }, - { id: 5, date: '토' }, - { id: 6, date: '일' }, -];