@@ -13,14 +13,22 @@ import styles from './Recipient.module.scss';
1313export 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