11"use client" ;
22
33import React , { useEffect , useState } from "react" ;
4- import styled , { css } from "styled-components" ;
4+ import styled from "styled-components" ;
55import { theme } from "@/styles/theme" ;
66import NavigatorBar from "@/components/common/NavigatorBar" ;
77import Button from "@/components/common/Button" ;
@@ -17,13 +17,15 @@ import { getLetterShareStatus } from "@/api/letter/share";
1717
1818const SendPreviewPage = ( ) => {
1919 const router = useRouter ( ) ;
20+ const isKakaoLoaded = useKakaoSDK ( ) ;
2021 const [ letterState , setLetterState ] = useRecoilState ( sendLetterState ) ;
2122 const { draftId, receiverName, content, images, templateType, letterId } =
2223 useRecoilValue ( sendLetterState ) ;
2324 const { name } = useRecoilValue ( userState ) ;
2425 const [ isImage , setIsImage ] = useState < boolean > ( false ) ;
25-
26- const isKakaoLoaded = useKakaoSDK ( ) ;
26+ const [ letterCode , setLetterCode ] = useState < string > ( "" ) ;
27+ const [ isLoading , setIsLoading ] = useState < boolean > ( false ) ;
28+ const [ isSharing , setIsSharing ] = useState < boolean > ( false ) ;
2729
2830 useEffect ( ( ) => {
2931 setIsImage ( ! ! ! ( content . length > 0 ) ) ;
@@ -35,65 +37,79 @@ const SendPreviewPage = () => {
3537
3638 const handleSendLetterAndShare = async ( ) => {
3739 /* 편지 전송 및 카카오 공유 */
40+ if ( isSharing ) return ; // 중복 실행 방지
41+
42+ setIsSharing ( true ) ;
43+ setIsLoading ( true ) ;
44+
45+ const { Kakao, location } = window ;
46+
47+ if ( ! isKakaoLoaded ) {
48+ console . error ( "Kakao SDK is not loaded yet" ) ;
49+ return ;
50+ }
51+
3852 try {
3953 // 1. 편지 전송 API 요청
40- if ( ! letterId ) {
41- const response = await postSendLtter ( {
42- draftId,
43- receiverName,
44- content,
45- images,
46- templateType,
47- } ) ;
48- console . log ( "편지 쓰기 성공" ) ;
49- setLetterState ( ( prevState ) => ( {
50- ...prevState ,
51- letterId : response . data . letterCode ,
52- } ) ) ;
53-
54- // 2. 카카오 공유 로직 실행
55- if ( isKakaoLoaded && response . data . letterCode ) {
56- setTimeout ( ( ) => {
57- const { Kakao, location } = window ;
58- Kakao . Share . sendScrap ( {
59- requestUrl : location . origin + location . pathname ,
60- templateId : 112798 ,
61- templateArgs : {
62- senderName : name ,
63- id : response . data . letterCode ,
64- } ,
65- serverCallbackArgs : {
66- requestType : "SHARE" ,
67- requestId : response . data . letterCode ,
68- } ,
69- } ) ;
70- } , 1000 ) ;
71- }
72- }
54+ const response = await postSendLtter ( {
55+ draftId,
56+ receiverName,
57+ content,
58+ images,
59+ templateType,
60+ } ) ;
61+ console . log ( "편지 쓰기 성공" ) ;
62+ setLetterState ( ( prevState ) => ( {
63+ ...prevState ,
64+ letterId : response . data . letterCode ,
65+ } ) ) ;
66+ setLetterCode ( response . data . letterCode ) ;
67+ console . log ( response . data . letterCode ) ;
68+
69+ // 2. 카카오 공유 로직 실행 (letterId 상태와 무관하게 항상 실행)
70+ Kakao . Share . sendScrap ( {
71+ requestUrl : location . origin + location . pathname ,
72+ templateId : 112798 ,
73+ templateArgs : {
74+ senderName : name ,
75+ id : response . data . letterCode ,
76+ } ,
77+ serverCallbackArgs : {
78+ requestType : "SHARE" ,
79+ requestId : response . data . letterCode ,
80+ } ,
81+ // 카카오톡 미설치 시 카카오톡 설치 경로이동
82+ installTalk : true ,
83+ } ) ;
84+ setIsLoading ( false ) ;
85+ setIsSharing ( false ) ;
7386 } catch ( error ) {
7487 console . log ( "편지 전송 또는 카카오 공유 실패:" , error ) ;
7588 }
7689 } ;
7790
7891 // 3. 공유 완료 상태 폴링
7992 useEffect ( ( ) => {
80- if ( letterState . letterId && letterState . letterId ?. length > 0 ) {
93+ if ( letterCode . length > 0 ) {
94+ console . log ( "letterCode" , letterCode ) ;
95+ let intervalTime = 300 ;
8196 const interval = setInterval ( async ( ) => {
8297 try {
83- const status = await getLetterShareStatus ( letterState . letterId || "" ) ;
98+ const status = await getLetterShareStatus ( letterCode || "" ) ;
8499 console . log ( status ) ;
85100 if ( status . isShared ) {
101+ console . log ( "완료" ) ;
86102 router . push ( "/send/complete" ) ;
87103 clearInterval ( interval ) ; // 폴링 중단
88104 }
89105 } catch ( error ) {
90106 console . error ( "공유 상태 조회 실패:" , error ) ;
91107 }
92- } , 3000 ) ;
108+ } , intervalTime ) ;
93109
94110 return ( ) => clearInterval ( interval ) ;
95111 }
96- } , [ letterState . letterId ] ) ;
112+ } , [ letterCode ] ) ;
97113
98114 return (
99115 < Layout >
@@ -134,7 +150,7 @@ const SendPreviewPage = () => {
134150 buttonType = "primary"
135151 text = "카카오로 편지 보내기"
136152 onClick = { handleSendLetterAndShare }
137- disabled = { ! receiverName || ! content }
153+ disabled = { ! receiverName || ! content || isLoading }
138154 >
139155 < Image
140156 src = "/assets/icons/ic_kakao_talk.svg"
0 commit comments