Skip to content

Commit b137e52

Browse files
Merge pull request #252 from ItRecode/FE-234
[FE-234] feat: ์ถ”์–ต๋ ˆ์ฝ”๋“œ ์บ˜๋ฆฐ๋” API ์—ฐ๋™ ๊ตฌํ˜„
2 parents f848319 + 4119059 commit b137e52

8 files changed

Lines changed: 118 additions & 16 deletions

File tree

โ€Žsrc/apis/myRecord.tsโ€Ž

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ const MEMORY_COMMENT_SIZE = 5
1212
const MY_RECORD_KEYWORD_SIZE = 10
1313

1414
export const getMemoryRecord = (
15-
pageParam: number
15+
pageParam: number,
16+
date: string
1617
): Promise<AxiosResponse<IMemoryRecordList>> => {
1718
return baseInstance.get(`/record/memory`, {
1819
params: {
20+
date,
1921
memoryRecordPage: pageParam,
2022
memoryRecordSize: MEMORY_RECORD_SIZE,
2123
sizeOfCommentPerRecord: MEMORY_COMMENT_SIZE,

โ€Žsrc/pages/MyRecord/Calendar/Calendar.tsxโ€Ž

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { Dispatch, SetStateAction, useState } from 'react'
1+
import React, { Dispatch, SetStateAction, useEffect, useState } from 'react'
22
import { ReactComponent as CloseIcon } from '@assets/myRecordIcon/close.svg'
33
import { ReactComponent as ArrowDown } from '@assets/myRecordIcon/arrow_down.svg'
44
import { ReactComponent as ArrowUp } from '@assets/myRecordIcon/arrow_up.svg'
@@ -7,7 +7,8 @@ import Button from '@components/Button'
77
import DateBox from './DateBox'
88
import CalendarMonthYear from './CalendarMonthYear'
99
import { useMyRecordByMonthYear } from '@react-query/hooks/useMyRecordByMonthYear'
10-
import { useNavigate } from 'react-router-dom'
10+
import { useLocation, useNavigate } from 'react-router-dom'
11+
import { getMonthYearDetail } from './getCalendarDetail'
1112

1213
interface CalendarProps {
1314
setIsOpenCalendar: Dispatch<SetStateAction<boolean>>
@@ -16,6 +17,7 @@ interface CalendarProps {
1617
const WEEK_TO_KR = ['์ผ', '์›”', 'ํ™”', '์ˆ˜', '๋ชฉ', '๊ธˆ', 'ํ† ']
1718

1819
export default function Calendar({ setIsOpenCalendar }: CalendarProps) {
20+
const { state } = useLocation()
1921
const navigate = useNavigate()
2022
const { today, monthYear, setMonthYear, recordsWithMonthYear } =
2123
useMyRecordByMonthYear()
@@ -25,7 +27,17 @@ export default function Calendar({ setIsOpenCalendar }: CalendarProps) {
2527
setIsOpenCalendar(false)
2628
})
2729
const isTodayMonthYear =
28-
monthYear.month === today.month && monthYear.year && today.month
30+
monthYear.month === today.month && monthYear.year === today.year
31+
const isFutureMonthYear =
32+
monthYear.month > today.month && monthYear.year === today.year
33+
34+
useEffect(() => {
35+
if (state) {
36+
setIsClickMonthYear(false)
37+
setMonthYear(getMonthYearDetail(new Date(`${state.year}-${state.month}`)))
38+
setSelectedDate(state.day)
39+
}
40+
}, [])
2941

3042
return (
3143
<div className="fixed top-0 z-30 block h-full w-full">
@@ -70,6 +82,7 @@ export default function Calendar({ setIsOpenCalendar }: CalendarProps) {
7082
hasRecord={recordsWithMonthYear?.includes(1)}
7183
selectedDate={selectedDate}
7284
setSelectedDate={setSelectedDate}
85+
isFutureMonthYear={isFutureMonthYear}
7386
/>
7487
{[...Array(monthYear.lastDayOfMonth)].map((_, i) =>
7588
i > 0 ? (
@@ -80,6 +93,7 @@ export default function Calendar({ setIsOpenCalendar }: CalendarProps) {
8093
selectedDate={selectedDate}
8194
hasRecord={recordsWithMonthYear?.includes(i + 1)}
8295
setSelectedDate={setSelectedDate}
96+
isFutureMonthYear={isFutureMonthYear}
8397
/>
8498
) : null
8599
)}
@@ -89,7 +103,16 @@ export default function Calendar({ setIsOpenCalendar }: CalendarProps) {
89103
aria-label="select-record-date-button"
90104
property={'solid'}
91105
active={selectedDate !== 0}
92-
onClick={() => navigate('/myrecord/date')}
106+
onClick={() =>
107+
navigate('/myrecord/date', {
108+
state: {
109+
year: monthYear.year,
110+
month: monthYear.month,
111+
day: selectedDate,
112+
},
113+
replace: state ? true : false,
114+
})
115+
}
93116
>
94117
์„ ํƒ
95118
</Button>
@@ -102,6 +125,7 @@ export default function Calendar({ setIsOpenCalendar }: CalendarProps) {
102125
year={monthYear.year}
103126
setIsChangedMonthYear={setIsClickMonthYear}
104127
setMonthYear={setMonthYear}
128+
setSelectedDate={setSelectedDate}
105129
/>
106130
)}
107131
</div>

โ€Žsrc/pages/MyRecord/Calendar/CalendarMonthYear.tsxโ€Ž

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import { getMonthYearDetail, MonthYear } from './getCalendarDetail'
66
interface CalendarMonthYearProps extends Pick<MonthYear, 'month' | 'year'> {
77
setMonthYear: Dispatch<SetStateAction<MonthYear>>
88
setIsChangedMonthYear: Dispatch<SetStateAction<boolean>>
9+
setSelectedDate: Dispatch<SetStateAction<number>>
910
}
1011

1112
export default function CalendarMonthYear({
1213
month,
1314
year,
1415
setMonthYear,
1516
setIsChangedMonthYear,
17+
setSelectedDate,
1618
}: CalendarMonthYearProps) {
1719
const [selectedMonth, setSelectedMonth] = useState(month)
1820
const [selectedYear, setSelectedYear] = useState(year)
@@ -65,6 +67,7 @@ export default function CalendarMonthYear({
6567
const setSelectedMonthYear = () => {
6668
const selectedDate = new Date(selectedYear, selectedMonth - 1)
6769
setMonthYear(getMonthYearDetail(selectedDate))
70+
setSelectedDate(0)
6871
setIsChangedMonthYear(false)
6972
}
7073

โ€Žsrc/pages/MyRecord/Calendar/CalendarRecord.tsxโ€Ž

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,42 @@
1-
import React, { useState } from 'react'
1+
import React, { useEffect, useState } from 'react'
2+
import { useLocation } from 'react-router-dom'
23
import Calendar from './Calendar'
34
import BackButton from '@components/BackButton'
5+
import Spinner from '@components/Spinner'
6+
import MemoryRecordCard from '../Common/MemoryRecordCard'
7+
import { useMemoryRecord } from '@react-query/hooks/useMemoryRecord'
8+
import { getFormattedDate } from '@utils/getFormattedDate'
9+
import { IMemoryRecord } from 'types/myRecord'
410
import { ReactComponent as CalendarIcon } from '@assets/myRecordIcon/calendar.svg'
11+
import { ReactComponent as ArrowDown } from '@assets/myRecordIcon/arrow_down.svg'
512

613
export default function CalendarRecord() {
714
const [isOpenCalendar, setIsOpenCalendar] = useState(false)
15+
const { state } = useLocation()
16+
const {
17+
memoryRecord,
18+
isLoading,
19+
hasNextPage,
20+
fetchNextPage,
21+
isFetchingNextPage,
22+
setDate,
23+
} = useMemoryRecord()
24+
25+
useEffect(() => {
26+
if (state) {
27+
setIsOpenCalendar(false)
28+
setDate(
29+
getFormattedDate(
30+
new Date(`${state.year}-${state.month}-${state.day}`),
31+
'hyphen'
32+
)
33+
)
34+
}
35+
}, [state])
36+
37+
if (isLoading) {
38+
return <></>
39+
}
840

941
return (
1042
<>
@@ -17,14 +49,49 @@ export default function CalendarRecord() {
1749
</div>
1850
<div className="mt-6 flex items-center justify-between px-6">
1951
<h2 className="text-lg font-semibold leading-[18px]">
20-
2023๋…„ 2์›” 1์ผ์˜ ์ถ”์–ต ๋ ˆ์ฝ”๋“œ
52+
{`${state.year}๋…„ ${state.month}์›” ${state.day}์ผ์˜ ์ถ”์–ต ๋ ˆ์ฝ”๋“œ`}
2153
</h2>
2254
<CalendarIcon
2355
className="cursor-pointer"
2456
onClick={() => setIsOpenCalendar(true)}
2557
/>
2658
</div>
2759
</section>
60+
<section id="date-selected-result-records">
61+
{memoryRecord?.pages.map(({ data }) =>
62+
data.memoryRecordList.map((memoryRecord: IMemoryRecord) => (
63+
<MemoryRecordCard
64+
key={memoryRecord.recordId}
65+
recordId={memoryRecord.recordId}
66+
title={memoryRecord.title}
67+
iconName={memoryRecord.iconName}
68+
colorName={memoryRecord.colorName}
69+
memoryRecordComments={memoryRecord.memoryRecordComments}
70+
/>
71+
))
72+
)}
73+
<div className="relative mb-[100px] h-[80px]">
74+
{hasNextPage && (
75+
<button
76+
className={`w-full bg-grey-1 ${
77+
!isFetchingNextPage && 'cursor-pointer border-t border-t-grey-3'
78+
}`}
79+
onClick={() => fetchNextPage()}
80+
>
81+
<div className="flex items-center justify-center py-2">
82+
{isFetchingNextPage ? (
83+
<Spinner size="button" />
84+
) : (
85+
<div className="py-2">
86+
<span className="text-sm text-primary-2">๋”๋ณด๊ธฐ</span>
87+
<ArrowDown className="ml-[10px]" />
88+
</div>
89+
)}
90+
</div>
91+
</button>
92+
)}
93+
</div>
94+
</section>
2895
{isOpenCalendar && <Calendar setIsOpenCalendar={setIsOpenCalendar} />}
2996
</>
3097
)

โ€Žsrc/pages/MyRecord/Calendar/DateBox.tsxโ€Ž

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ interface DateBoxProps {
77
hasRecord?: boolean
88
selectedDate: number
99
setSelectedDate: Dispatch<SetStateAction<number>>
10+
isFutureMonthYear: boolean
1011
}
1112

1213
export default function DateBox({
@@ -16,15 +17,18 @@ export default function DateBox({
1617
hasRecord,
1718
selectedDate,
1819
setSelectedDate,
20+
isFutureMonthYear,
1921
}: DateBoxProps) {
2022
const [isClickedDay, setIsClickedDay] = useState(false)
2123
const [disabledDay, setDisabledDay] = useState(false)
2224

2325
useEffect(() => {
24-
if (todayDate && date > todayDate) {
26+
if ((todayDate && date > todayDate) || isFutureMonthYear) {
2527
setDisabledDay(true)
28+
} else {
29+
setDisabledDay(false)
2630
}
27-
}, [])
31+
}, [disabledDay])
2832

2933
useEffect(() => {
3034
if (selectedDate === date) {

โ€Žsrc/pages/MyRecord/MyRecord.tsxโ€Ž

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,7 @@ export default function MyRecord() {
5454
</h2>
5555
<CalendarIcon
5656
className="cursor-pointer"
57-
onClick={() => {
58-
navigate('/notservice')
59-
// setIsOpenCalendar(true)
60-
}}
57+
onClick={() => setIsOpenCalendar(true)}
6158
/>
6259
</div>
6360
<MemoryRecord />

โ€Žsrc/react-query/hooks/useMemoryRecord.tsโ€Ž

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
import { QUERY_KEYS } from '@react-query/queryKeys'
22
import { useInfiniteQuery } from '@tanstack/react-query'
33
import { getMemoryRecord } from '@apis/myRecord'
4+
import { useState } from 'react'
45

56
export const useMemoryRecord = () => {
7+
const [date, setDate] = useState('')
8+
69
const {
710
data: memoryRecord = null,
811
isLoading,
912
hasNextPage,
1013
fetchNextPage,
1114
isFetchingNextPage,
1215
} = useInfiniteQuery({
13-
queryKey: [QUERY_KEYS.memoryRecord],
14-
queryFn: async ({ pageParam = 0 }) => await getMemoryRecord(pageParam),
16+
queryKey: [QUERY_KEYS.memoryRecord, date],
17+
queryFn: async ({ pageParam = 0 }) =>
18+
await getMemoryRecord(pageParam, date),
1519
getNextPageParam: (lastPage): number | null => {
1620
const { data, config } = lastPage
1721
if (data.totalPage > config.params.memoryRecordPage + 1) {
@@ -27,5 +31,6 @@ export const useMemoryRecord = () => {
2731
hasNextPage,
2832
fetchNextPage,
2933
isFetchingNextPage,
34+
setDate,
3035
}
3136
}

โ€Žsrc/react-query/hooks/useMyRecordByMonthYear.tsโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export const useMyRecordByMonthYear = () => {
1111
)
1212

1313
const { data = null, isLoading } = useQuery(
14-
[monthYear.month, monthYear],
14+
[monthYear.month, monthYear.year],
1515
async () =>
1616
await getRecordByMonthYear(
1717
getFormattedDateWithMonthYear(monthYear.year, monthYear.month)

0 commit comments

Comments
ย (0)