MOZI์๋ Upcoming
์ด๋ผ๋ ํญ์ด ์กด์ฌํฉ๋๋ค. ์ด ํญ์์๋ ๋ค๊ฐ์ค๋ ํ ์ผ์ ๋ณผ ์ ์๊ณ ํ ์ผ์ ๋ฑ๋กํ ์ ์์ต๋๋ค.
์ด ๊ธ์ ์ ํ๋ฉด๊ณผ ๊ฐ์ด ๋ฌ๋ ฅ์ ๋ง๋ค์ด๋ณด๋ฉด์ ๊ฒช์ ๊ฒฝํ์ ๊ธฐ๋กํ ๊ธ์ ๋๋ค.
์บ๋ฆฐ๋๋ฅผ ๋ง๋ ๋ค๊ณ ํ๋ ๋ชฉ๋ฏผ์ฃผ ๋ฉํ ๋์ด ์์์ ํ๊ฐ ์ถ์ฒํด์ฃผ์
์ ๋ดค์ต๋๋ค. ์์์ ๋ณด๋ ๋ ์ง๋ฅผ Date
๊ฐ์ฒด๋ก ์ง์ ๋ค๋ฃจ๋ ๊ฒ์ ํท๊ฐ๋ฆด๋งํ ๋ถ๋ถ์ด ๋ง์์ต๋๋ค.
JavaScript์์ ๋ ์ง๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ ๊น๋ค๋กญ๊ธฐ ๋๋ฌธ์ moment
, dayjs
, date-fns
์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณค ํฉ๋๋ค. ์ ๋ ์ฒ์๋ถํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง๋ ์์์ต๋๋ค.(Date ๊ฐ์ฒด๋ฅผ ๋ง์ด ๋ค๋ฃจ์ด๋ณด์ง ์์๊ธฐ ๋๋ฌธ์ Date ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ์ด ๋ณด๊ณ ์ถ์์ + React ์์ด vanilla๋ก ์บ๋ฆฐ๋ ๊ฐ๋ฐ)
์ ๋ mozi-calendar๋ผ๋ ๋ ํฌ๋ฅผ ๋ง๋ค๊ณ Date ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ์บ๋ฆฐ๋๋ฅผ ๋ง๋๋ ๊ฒ์ ์ฐ์ตํด๋ณด๊ธฐ๋ก ํฉ๋๋ค. ์ ๋ ์ผ๋จ ์ฝ๋๋ฅผ ์ณ๋ณด๊ณ ์ดํด๊ฐ ์๊ฐ๋ฉด ๊ฒ์ํด์ ๋ฌธ์๋ฅผ ๋ณด๊ณ ์ดํดํ๋ ๋ฐฉ์์ ์ข์ํ๊ธฐ ๋๋ฌธ์ ๋จผ์ Date ๊ฐ์ฒด๋ฅผ ๋ง์๋๋ก ๋ค๋ฃจ์ด๋ดค์ต๋๋ค.
const date = new Date() // Tue Oct 04 2022 02:26:17 GMT+0900 (ํ๊ตญ ํ์ค์)
๋จผ์ new Date()
๋ฅผ ์ฝ์์ ์ฐ์ด๋ณด๋ ์์ ๊ฐ์ด ๋์์ต๋๋ค. ๋ญ๊ฐ ์ค๋ ๋ ์ง์ ์๊ฐ์ด ๋์ค๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ผ๋จ ๋ฌ๋ ฅ์ ์ค๋์ ๋
๋, ์, ์ผ์ ํ์ํด์ผํ๋ฏ๋ก date์์๋ถํฐ ๊ฐ์ ธ์๋ณด๊ฒ ์ต๋๋ค.
date.getFullYear() // 2022
date.getMonth() // 9
date.getDate() // 4
์ด๋ ๊ฒ ๋ , ์, ์ผ์ ๊ฐ์ ธ์๋ดค์ต๋๋ค. ์ฌ๋ฐ๋ ์ ์ ๋ ํ๊ณ ์ผ์ ๊ด์ฐฎ์๋ฐ ์์ ์ธ๋ฑ์ค๊ฐ 0๋ถํฐ ์์ํ๋ค๊ณ ํฉ๋๋ค. 0์ 1์, 1์ 2์ ... ๊ทธ๋ฌ๋๊น 9๋ 10์์ ๋๋ค. ์ค๋์ด 2022๋ 10์ 4์ผ์ด๋ฏ๋ก ๋ง์ต๋๋ค.
๊ทธ๋ผ ์ด์ ์กฐ๊ธ ๋์๊ฐ์ ์ด๋ฒ ๋ฌ์ ์ฒซ์งธ ๋ ๊ณผ ๋ง์ง๋ง ๋ ์ ์์๋ณด๊ฒ ์ต๋๋ค.
new Date(year, month, 1) // ๋ฌ์ ์ฒซ๋ : Sat Oct 01 2022 00:00:00 GMT+0900 (ํ๊ตญ ํ์ค์)
new Date(year, month + 1, 0) // ๋ฌ์ ๋ง์ง๋ง ๋ : Mon Oct 31 2022 00:00:00 GMT+0900 (ํ๊ตญ ํ์ค์)
์ง๊ธ๊น์ง์ ๋ด์ฉ์ผ๋ก ๋ฌ๋ ฅ์ ์๋ถ๋ถ์ธ Navigator
๋ถ๋ถ์ ํ์ฌ ๋
๋์ ์์ ํํ ์ ์์ต๋๋ค.
const getNavigatorHTML = (today: Date) => {
return html`
<button class="move-month-button">
โ ${MONTHS[today.getMonth() == 0 ? 11 : today.getMonth() - 1]} ${today.getMonth() <=
0
? today.getFullYear() - 1
: today.getFullYear()}
</button>
<h1 class="month-display">
${MONTHS[today.getMonth()]}<br />${today.getFullYear()}
</h1>
<button class="move-month-button">
${MONTHS[today.getMonth() == 11 ? 0 : today.getMonth() + 1]} ${today.getMonth() >=
11
? today.getFullYear() + 1
: today.getFullYear()} โ
</button>
`
}
์ด๋ ๊ฒ ๋ค๋น๊ฒ์ด์ ์ ๋ง๋ค์ด์ค ํ์ ์ ๋ฌ๊ณผ ๋ค์๋ฌ๋ก ์ด๋ํ ๋ ๋ค๋น๊ฒ์ด์ ๊ณผ ์บ๋ฆฐ๋ ๋ถ๋ถ์ ๋ค์ ๋ ๋๋ง ํ๋ฉด ๋ฌ๋ ฅ์ด ์์ฑ๋ฉ๋๋ค.
const previousMonthButtonDidPress = () => {
displayDate.setMonth(displayDate.getMonth() - 1)
renderNavigator(document.getElementById("navigator"), displayDate)
renderCalendar(document.getElementById("calendar"), displayDate)
}
์ด์ ๋ค๋น๊ฒ์ด์ ๋ถ๋ถ์ ์์ฑํ์ผ๋ ์บ๋ฆฐ๋๋ถ๋ถ์ผ๋ก ๊ฐ๋ณด๊ฒ ์ต๋๋ค. ์บ๋ฆฐ๋์ ์ต์๋จ์๋ ์ผ~์ ๋ ์ง๊ฐ ํ์๋์ด์์ต๋๋ค.
for (let d = 0; d < NUMBER_OF_DAYS_IN_WEEK; d++) {
calendarContents.push(
html`
<div class="${NAME_OF_DAYS[d]} calendar-cell">
${LONG_NAME_OF_DAYS[d]}
</div>
`
)
}
์ฝ๋๋ก ํํํ๋ฉด ์ผ~์์ ์บ๋ฆฐ๋ ์ปจํ ์ธ ๋ฐฐ์ด์ ํธ์ฌํด์ฃผ๋ฉด ๋ฉ๋๋ค. ๊ทธ ๋ค์ ์ค์ ์บ๋ฆฐ๋๋ฅผ ๋ ๋๋งํ ๊ฑด๋ฐ ๋ณด์ฌ์ง๋ ๋ถ๋ถ์ 3๊ฐ์ง์ ๋๋ค. ์ด์ ๋ฌ, ํ์ฌ๋ฌ, ๋ค์๋ฌ ๋ฐ๋ผ์ 3๋ฒ์ for๋ฌธ์์ calendar ๊ฐ๊ฐ์ ๋ฌ์ ์ฐ๋ ๋ก์ง์ ์์ฑํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
for (
let d = 0;
d <
(thisMonthFirstDate.getDay() > 0
? thisMonthFirstDate.getDay()
: NUMBER_OF_DAYS_IN_WEEK);
d++
) {
calendarContents.push(
html`<div
class="
${d % 7 === 0 ? "sun" : ""}
${d % 7 === 6 ? "sat" : ""}
calendar-cell
past-month
"
>
${lastMonthLastDate.getMonth() + 1}/${lastMonthLastDate.getDate() -
thisMonthFirstDate.getDay() +
d +
1 -
(thisMonthFirstDate.getDay() > 0 ? 0 : NUMBER_OF_DAYS_IN_WEEK)}
</div>`
)
}
for (let d = 0; d < thisMonthLastDate.getDate(); d++) {
calendarContents.push(
html`<div
class="
${today.getDate() === d + 1 &&
ACTUAL_TODAY.getFullYear() === today.getFullYear() &&
ACTUAL_TODAY.getDate() === today.getDate() &&
ACTUAL_TODAY.getMonth() === today.getMonth()
? "today"
: ""}
${(thisMonthFirstDate.getDay() + d) % 7 === 0 ? "sun" : ""}
${(thisMonthFirstDate.getDay() + d) % 7 === 6 ? "sat" : ""}
calendar-cell
this-month
"
>
${today.getMonth() + 1}/${d + 1} ${today.getDate() === d + 1 &&
ACTUAL_TODAY.getFullYear() === today.getFullYear() &&
ACTUAL_TODAY.getDate() === today.getDate() &&
ACTUAL_TODAY.getMonth() === today.getMonth()
? " today"
: ""}
</div>`
)
}
let nextMonthDaysToRender = 7 - (calendarContents.length % 7)
for (let d = 0; d < nextMonthDaysToRender; d++) {
calendarContents.push(
html`<div
class="
${(nextMonthFirstDate.getDay() + d) % 7 === 0 ? "sun" : ""}
${(nextMonthFirstDate.getDay() + d) % 7 === 6 ? "sat" : ""}
calendar-cell
next-month
"
>
${nextMonthFirstDate.getMonth() + 1}/${d + 1}
</div>`
)
}
์ด์ ์บ๋ฆฐ๋๋ฅผ ๋ ๋๋งํ์ผ๋ ์คํ์ผ๋ง๋ง ์ ํ์ฃผ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ฑ๋ฉ๋๋ค. Vanilla, TypeScript, React ์ด ์ธ๊ฐ์ง ๋ฒ์ ์ผ๋ก ๋ง๋ค์ด์ ์ฐ์ต์ ํ์ต๋๋ค.