Skip to content

Commit bee38cf

Browse files
committed
✨ feat: allMessages state 추가하여 메시지 수 관리
1 parent 74ebebe commit bee38cf

File tree

1 file changed

+77
-14
lines changed

1 file changed

+77
-14
lines changed

src/pages/Recipient/Recipient.jsx

Lines changed: 77 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,22 @@ import styles from './Recipient.module.scss';
1313
export default function Recipient({ showDelete }) {
1414
const { id } = useParams();
1515
const [postData, setPostData] = useState(null);
16+
const [allMessages, setAllMessages] = useState([]);
1617
const [messages, setMessages] = useState([]);
1718
const [offset, setOffset] = useState(0);
1819
const [loading, setLoading] = useState(false);
1920
const [hasNextMessage, setHasNextMessage] = useState(false);
2021
const [selectedCardId, setSelectedCardId] = useState(null);
22+
const [userScrolled, setUserScrolled] = useState(false);
2123
const observerRef = useRef();
2224
const navigate = useNavigate();
2325

26+
useEffect(() => {
27+
const handleScroll = () => setUserScrolled(true);
28+
window.addEventListener('scroll', handleScroll);
29+
return () => window.removeEventListener('scroll', handleScroll);
30+
}, []);
31+
2432
useEffect(() => {
2533
const fetchRecipient = async () => {
2634
try {
@@ -36,15 +44,71 @@ export default function Recipient({ showDelete }) {
3644
fetchRecipient();
3745
}, [id]);
3846

47+
useEffect(() => {
48+
const fetchInitialMessages = async () => {
49+
setLoading(true);
50+
try {
51+
const limit = 6;
52+
const initialMessages = await getMessages(id, 0, limit);
53+
54+
setAllMessages(initialMessages.results);
55+
56+
if (showDelete) {
57+
setMessages(initialMessages.results);
58+
} else {
59+
if (initialMessages.results.length % 6 === 0) {
60+
setMessages(
61+
initialMessages.results.slice(
62+
0,
63+
initialMessages.results.length - 1,
64+
),
65+
);
66+
} else {
67+
setMessages(initialMessages.results);
68+
}
69+
}
70+
71+
if (postData) {
72+
setHasNextMessage(limit < postData.messageCount);
73+
}
74+
} catch (error) {
75+
console.error('초기 메시지 로딩 실패:', error);
76+
}
77+
setLoading(false);
78+
};
79+
80+
fetchInitialMessages();
81+
}, [id, postData]);
82+
3983
useEffect(() => {
4084
setLoading(true);
4185
const fetchMessages = async () => {
4286
try {
43-
const limit = offset === 0 ? 5 : 6;
87+
const limit = 6;
4488
const newMessages = await getMessages(id, offset, limit);
45-
offset === 0
46-
? setMessages(newMessages.results)
47-
: setMessages((prev) => [...prev, ...newMessages.results]);
89+
console.log('offset', offset, 'limit', limit);
90+
setAllMessages((prev) => {
91+
const combined = [...prev, ...newMessages.results];
92+
93+
const uniqueMessages = Array.from(
94+
new Map(combined.map((message) => [message.id, message])).values(),
95+
);
96+
97+
return uniqueMessages;
98+
});
99+
100+
if (showDelete) {
101+
setMessages(allMessages);
102+
} else {
103+
if (
104+
allMessages.length % 6 === 0 &&
105+
allMessages.length !== newMessages.count
106+
) {
107+
setMessages(allMessages.slice(0, allMessages.length - 1));
108+
} else {
109+
setMessages(allMessages);
110+
}
111+
}
48112
if (!postData) return;
49113
setHasNextMessage(offset < postData.messageCount);
50114
setLoading(false);
@@ -57,10 +121,11 @@ export default function Recipient({ showDelete }) {
57121
};
58122

59123
fetchMessages();
60-
}, [id, offset]);
124+
}, [id, offset, showDelete]);
61125

62126
useEffect(() => {
63127
const observer = new IntersectionObserver((entries) => {
128+
if (!userScrolled) return;
64129
const firstEntry = entries[0];
65130
if (firstEntry.isIntersecting && hasNextMessage && !loading) {
66131
loadMoreMessages();
@@ -70,23 +135,21 @@ export default function Recipient({ showDelete }) {
70135
return () => {
71136
if (observerRef.current) observer.unobserve(observerRef.current);
72137
};
73-
}, [hasNextMessage, loading]);
138+
}, [userScrolled, hasNextMessage, loading, offset]);
74139

75140
const loadMoreMessages = () => {
76-
const limit = offset === 0 ? 5 : 6;
141+
if (loading || !hasNextMessage) return;
142+
setLoading(true);
143+
const limit = 6;
77144
setOffset((prev) => prev + limit);
78145
};
79146

80147
async function handleDeleteMessage(messageId, recipientId) {
81148
try {
82149
await deleteMessage(messageId);
83-
const newOffset = offset - 1 < 0 ? 0 : offset - 1;
84-
85-
const updatedMessages = await getMessages(recipientId, 0, newOffset);
86-
setMessages(updatedMessages.results);
87-
setHasNextMessage(updatedMessages.results.length < postData.messageCount);
88-
89-
setOffset(0);
150+
const updatedAllMessages = await getMessages(recipientId, 0, offset);
151+
setAllMessages(updatedAllMessages.results);
152+
setOffset((prev) => prev - 6);
90153
} catch (error) {
91154
console.error('삭제 실패:', error);
92155
}

0 commit comments

Comments
 (0)