64 |
65 |
66 |
67 | {days.map((day, index) => (
68 |
69 |
{dayOfWeek[index]}
70 |
71 |
75 | {day.date}
76 |
77 |
78 |
79 | ))}
80 |
81 |
82 |
83 | {hours24.map(hour => (
84 |
85 | {hour.text}시
86 |
87 | ))}
88 |
89 |
90 | {days.map(day => (
91 |
95 | {hours24.map((hour, index) => (
96 |
modalHandle(day.day, index * 4)}
100 | />
101 | ))}
102 | {scheduleData[day.day] && (
103 | <>
104 | {scheduleData[day.day].map((s, idx) => {
105 | const t = s.start.hour * 60 + s.start.minute
106 | const top = `${t}px`
107 | let h = (s.end.hour - s.start.hour) * 60 - s.start.minute + s.end.minute
108 | if (h < 20) h = 20
109 | const height = `${h}px`
110 | return (
111 |
{
117 | scheduleHandle(
118 | { top: e.clientY, left: e.clientX },
119 | { date: day.day, index: idx }
120 | )
121 | }}
122 | >
123 | {s.title}
124 |
125 | )
126 | })}
127 | >
128 | )}
129 |
130 | ))}
131 |
132 |
133 |
134 |
135 | {isDeleteOpen && (
136 |
deleteHandle()}
140 | >
141 | 삭제
142 |
143 | )}
144 | >
145 | )
146 | }
147 |
--------------------------------------------------------------------------------
/src/components/AddScheduleModal.tsx:
--------------------------------------------------------------------------------
1 | import React, { Dispatch, SetStateAction, useEffect, useState } from 'react'
2 | import createSelectTimes from '../util/createSelectTimes'
3 | import { useDispatch } from 'react-redux'
4 | import { tRangeColor, tScheduleDetail } from '../../index'
5 | import { addSchedule } from '../store/modules/schedule'
6 |
7 | export default function AddScheduleModal({
8 | defaultDate,
9 | timeIndex,
10 | isOpen,
11 | setIsOpen,
12 | }: {
13 | defaultDate: string
14 | timeIndex: number
15 | isOpen: boolean
16 | setIsOpen: Dispatch
>
17 | }) {
18 | const dispatch = useDispatch()
19 | const [isSelectStartTime, setIsSelectStartTime] = useState(false)
20 | const [isSelectEndTime, setIsSelectEndTime] = useState(false)
21 |
22 | const [title, setTitle] = useState('')
23 | const [date, setDate] = useState('2021-12-31')
24 | const [color, setColor] = useState('red')
25 | const [startHour, setStartHour] = useState(12)
26 | const [startMinute, setStartMinute] = useState(12)
27 | const [endHour, setEndHour] = useState(0)
28 | const [endMinute, setEndMinute] = useState(0)
29 |
30 | const [startSelectTimeIndex, setStartSelectTimeIndex] = useState(0)
31 | const [endSelectTimeIndex, setEndSelectTimeIndex] = useState(-1)
32 |
33 | const [displayStartTime, setDisplayStartTime] = useState('')
34 | const [displayEndTime, setDisplayEndTime] = useState('')
35 |
36 | const selectTimes: Array<{ hour: number; minute: string; text: string }> = createSelectTimes()
37 | const colors: tRangeColor[] = ['red', 'orange', 'green', 'blue', 'brown', 'pink']
38 |
39 | const startTimeChange = (hour: number, minute: string, text: string, index: number) => {
40 | if (endSelectTimeIndex < index) {
41 | endTimeChange(hour, minute, text, index)
42 | }
43 | setStartSelectTimeIndex(index)
44 | setIsSelectStartTime(false)
45 | setDisplayStartTime(text)
46 | setStartHour(hour)
47 | setStartMinute(parseInt(minute))
48 | }
49 |
50 | const endTimeChange = (hour: number, minute: string, text: string, index: number) => {
51 | setEndSelectTimeIndex(index)
52 | setIsSelectEndTime(false)
53 | setDisplayEndTime(text)
54 | setEndHour(hour)
55 | setEndMinute(parseInt(minute))
56 | }
57 |
58 | const submitHandle = (e: React.FormEvent) => {
59 | e.preventDefault()
60 | setIsOpen(false)
61 | setTitle('')
62 | const schedule: { date: string; data: tScheduleDetail } = {
63 | date: date,
64 | data: {
65 | start: { hour: startHour, minute: startMinute },
66 | end: { hour: endHour, minute: endMinute },
67 | color: color,
68 | title: title,
69 | },
70 | }
71 | dispatch(addSchedule(schedule))
72 | }
73 |
74 | useEffect(() => {
75 | setDate(defaultDate)
76 | const defaultTime = selectTimes[timeIndex]
77 | startTimeChange(defaultTime.hour, defaultTime.minute, defaultTime.text, timeIndex)
78 | }, [defaultDate, timeIndex])
79 |
80 | return (
81 |
86 |
87 |
99 |
100 |