diff --git a/src/components/GiftAdd/AddGiftFooter/AddGiftFooter.tsx b/src/components/GiftAdd/AddGiftFooter/AddGiftFooter.tsx index 292c5953..e40a3007 100644 --- a/src/components/GiftAdd/AddGiftFooter/AddGiftFooter.tsx +++ b/src/components/GiftAdd/AddGiftFooter/AddGiftFooter.tsx @@ -1,4 +1,3 @@ -import { useNavigate } from 'react-router-dom'; import usePostGift from '../../../hooks/queries/gift/usePostGift'; import GiftAddNextBtn from '../AddGiftLink/common/GiftAddNextBtn/GiftAddNextBtn'; import * as S from './AddGiftFooter.styled'; @@ -17,6 +16,7 @@ interface AddGiftFooterProps { setImageUrl: React.Dispatch>; updateAddGiftInfo: (newInfo: Partial) => void; fileName: string; + setIsLoading: React.Dispatch>; } const AddGiftFooter = ({ @@ -31,30 +31,22 @@ const AddGiftFooter = ({ setImageUrl, fileName, updateAddGiftInfo, + setIsLoading, }: AddGiftFooterProps) => { - const navigate = useNavigate(); - const { mutation } = usePostGift(roomId, targetDate, setStep); + const { mutation } = usePostGift(roomId, targetDate, setStep, updateAddGiftInfo, setIsLoading); const { putImageUrlToS3 } = usePutImageUrlToS3(roomId); const onClick = async () => { + setIsLoading(true); const { imageUrlS3 } = await putImageUrlToS3({ fileName, file, roomId, setImageUrl }); if (isActivated) { - updateAddGiftInfo({ name: '', cost: 0, imageUrl: '', url: '' }); - mutation.mutate( - { - roomId: roomId, - name: name, - cost: cost, - imageUrl: imageUrlS3, - url: link, - }, - { - onSuccess: () => { - navigate(`/add-gift/${roomId}/${targetDate}`); - setStep(0); - }, - }, - ); + mutation.mutate({ + roomId: roomId, + name: name, + cost: cost, + imageUrl: imageUrlS3, + url: link, + }); } }; diff --git a/src/components/GiftAdd/AddGiftLayout/AddGiftWithLinkLayout.tsx b/src/components/GiftAdd/AddGiftLayout/AddGiftWithLinkLayout.tsx index 55719ef5..f5e16fbd 100644 --- a/src/components/GiftAdd/AddGiftLayout/AddGiftWithLinkLayout.tsx +++ b/src/components/GiftAdd/AddGiftLayout/AddGiftWithLinkLayout.tsx @@ -18,7 +18,9 @@ interface AddGiftWithLinkLayoutProps { openGraph: OpenGraphResponseType; targetDate: string; updateAddGiftInfo: (newInfo: Partial) => void; + setModalStatus: React.Dispatch>; addGiftInfo: AddGiftInfo; + setIsLoading: React.Dispatch>; } const AddGiftWithLinkLayout = ({ @@ -29,7 +31,9 @@ const AddGiftWithLinkLayout = ({ openGraph, targetDate, updateAddGiftInfo, + setModalStatus, addGiftInfo, + setIsLoading, }: AddGiftWithLinkLayoutProps) => { const [isActivated, setIsActivated] = useState( !!addGiftInfo.name && !!addGiftInfo.cost && !!addGiftInfo.imageUrl, @@ -52,15 +56,23 @@ const AddGiftWithLinkLayout = ({ useEffect(() => { const fetchData = async () => { + console.log('OpenGraph imageUrl', openGraph); setNameText(openGraph.title); - const convertedOgFile = await useConvertURLtoFile(openGraph.image); - setFile(convertedOgFile); - setFileName(openGraph.image); - setImageUrl(openGraph.image); + const convertResult = await useConvertURLtoFile({ + url: openGraph.image, + setStep, + setModalStatus, + updateAddGiftInfo, + }); + if (convertResult && 'convertedOgFile' in convertResult) { + setFile(convertResult.convertedOgFile); + setFileName(openGraph.image); + setImageUrl(openGraph.image); + } }; fetchData(); - }, [openGraph]); + }, [openGraph, setStep]); return ( @@ -103,6 +115,7 @@ const AddGiftWithLinkLayout = ({ updateAddGiftInfo={updateAddGiftInfo} file={file} setImageUrl={setImageUrl} + setIsLoading={setIsLoading} /> ); diff --git a/src/components/GiftAdd/AddGiftLayout/AddGiftWithoutLinkLayout.tsx b/src/components/GiftAdd/AddGiftLayout/AddGiftWithoutLinkLayout.tsx index ba6168e5..bced5aee 100644 --- a/src/components/GiftAdd/AddGiftLayout/AddGiftWithoutLinkLayout.tsx +++ b/src/components/GiftAdd/AddGiftLayout/AddGiftWithoutLinkLayout.tsx @@ -20,6 +20,7 @@ interface AddGiftWithLinkLayoutProps { openGraph: OpenGraphResponseType; updateAddGiftInfo: (newInfo: Partial) => void; addGiftInfo: AddGiftInfo; + setIsLoading: React.Dispatch>; } // 직접 입력 화면 @@ -31,7 +32,9 @@ export const AddGiftWithoutLinkLayout = ({ setLinkText, targetDate, updateAddGiftInfo, + modalStatus, addGiftInfo, + setIsLoading, }: AddGiftWithLinkLayoutProps) => { const [isActivated, setIsActivated] = useState( !!addGiftInfo.name && !!addGiftInfo.cost && !!addGiftInfo.url && !!addGiftInfo.imageUrl, @@ -43,7 +46,7 @@ export const AddGiftWithoutLinkLayout = ({ const [file, setFile] = useState(null); const [, setIsImageUploaded] = useState(false); const [, setPreviewImage] = useState(null); - const [isModalOpen, setIsModalOpen] = useState(true); + const [isModalOpen, setIsModalOpen] = useState(modalStatus); const checkPriceNull = (price: number | null) => { if (price === null) { @@ -55,7 +58,7 @@ export const AddGiftWithoutLinkLayout = ({ // 모달 확인 클릭 버튼 const handleClickConfirmClick = () => { - setIsModalOpen(!isModalOpen); + setIsModalOpen(false); setStep(3); }; @@ -109,6 +112,7 @@ export const AddGiftWithoutLinkLayout = ({ updateAddGiftInfo={updateAddGiftInfo} file={file} setImageUrl={setImageUrl} + setIsLoading={setIsLoading} /> ); diff --git a/src/components/GiftAdd/AddGiftLayout/common/AddGiftImg/AddGiftImg.tsx b/src/components/GiftAdd/AddGiftLayout/common/AddGiftImg/AddGiftImg.tsx index 2c81a6fc..3042b7c2 100644 --- a/src/components/GiftAdd/AddGiftLayout/common/AddGiftImg/AddGiftImg.tsx +++ b/src/components/GiftAdd/AddGiftLayout/common/AddGiftImg/AddGiftImg.tsx @@ -37,7 +37,7 @@ const AddGiftImg = ({ >; isActivated: boolean; - onClick: () => void; + onClick: VoidFunction; } const GiftAddBtnWrapper = ({ setStep, isActivated, onClick }: GiftAddBtnWrapperProps) => { @@ -16,7 +16,7 @@ const GiftAddBtnWrapper = ({ setStep, isActivated, onClick }: GiftAddBtnWrapperP return ( - 링크 없이 상품을 등록할게요 + 링크 없이 상품을 등록할게요 ); diff --git a/src/components/GiftAdd/AddGiftLink/common/InputUrl/InputUrl.tsx b/src/components/GiftAdd/AddGiftLink/common/InputUrl/InputUrl.tsx index 0aff855d..9c45ba02 100644 --- a/src/components/GiftAdd/AddGiftLink/common/InputUrl/InputUrl.tsx +++ b/src/components/GiftAdd/AddGiftLink/common/InputUrl/InputUrl.tsx @@ -10,8 +10,8 @@ interface InputUrlProps { const InputUrl = ({ setIsActivated, text, setText }: InputUrlProps) => { const onChange = (e: React.ChangeEvent) => { const inputValue = e.target.value; - inputValue.length > 0 ? setIsActivated(true) : setIsActivated(false); setText(inputValue); + inputValue.length > 0 ? setIsActivated(true) : setIsActivated(false); }; const handleBtnClick = () => { diff --git a/src/context/AddGift/AddGiftContext.tsx b/src/context/AddGift/AddGiftContext.tsx index 6123cf69..dd176a9c 100644 --- a/src/context/AddGift/AddGiftContext.tsx +++ b/src/context/AddGift/AddGiftContext.tsx @@ -10,7 +10,7 @@ const initialAddGiftInfo: AddGiftInfo = { name: '', cost: 0, imageUrl: '', - url: ',', + url: '', }; const AddGiftContext = createContext({ diff --git a/src/hooks/queries/gift/usePostGift.tsx b/src/hooks/queries/gift/usePostGift.tsx index 2f6094bb..ffe7eaa5 100644 --- a/src/hooks/queries/gift/usePostGift.tsx +++ b/src/hooks/queries/gift/usePostGift.tsx @@ -1,6 +1,6 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { post } from '../../../apis/client'; -import { GiftPostRequestType } from '../../../types/gift'; +import { AddGiftInfo, GiftPostRequestType } from '../../../types/gift'; import { useNavigate } from 'react-router-dom'; import { MY_GIFT_QUERY_KEY } from './useGetMyGift'; @@ -12,6 +12,8 @@ export const usePostGift = ( roomId: number, targetDate: string, setStep: React.Dispatch>, + updateAddGiftInfo: (newInfo: Partial) => void, + setIsLoading: React.Dispatch>, ) => { const navigate = useNavigate(); @@ -24,6 +26,8 @@ export const usePostGift = ( queryClient.invalidateQueries({ queryKey: [MY_GIFT_QUERY_KEY[0], roomId] }); navigate(`/add-gift/${roomId}/${targetDate}`); setStep(0); + setIsLoading(false); + updateAddGiftInfo({ name: '', cost: 0, imageUrl: '', url: '' }); }, onError: (error) => { console.log('선물 등록 에러!!', error.message); diff --git a/src/hooks/useConvertURLtoFile.tsx b/src/hooks/useConvertURLtoFile.tsx index 22480611..1d18d4d9 100644 --- a/src/hooks/useConvertURLtoFile.tsx +++ b/src/hooks/useConvertURLtoFile.tsx @@ -1,10 +1,39 @@ -const useConvertURLtoFile = async (url: string) => { - const response = await fetch(url); - const data = await response.blob(); - const ext = url.split('.').pop(); // url 구조에 맞게 수정할 것 - const filename = url.split('/').pop(); // url 구조에 맞게 수정할 것 - const metadata = { type: `image/${ext}` }; - return new File([data], filename!, metadata); +import { AddGiftInfo } from '../types/gift'; + +interface convertURLtoFileProps { + url: string; + setStep: React.Dispatch>; + setModalStatus: React.Dispatch>; + updateAddGiftInfo: (newInfo: Partial) => void; +} + +const useConvertURLtoFile = async ({ + url, + setStep, + setModalStatus, + updateAddGiftInfo, +}: convertURLtoFileProps) => { + console.log('들어오고 있는 url', url); + try { + const response = await fetch(url); + + if (response.status === 302) { + return setStep(3); + } + + const data = await response.blob(); + // const extensions = url.split('.').pop(); + const filename = url.split('/').pop(); + const metadata = { type: `image/*` }; + const convertedOgFile = new File([data], filename!, metadata); + return { convertedOgFile }; + } catch (error) { + console.error('error?', error); + updateAddGiftInfo({ imageUrl: '' }); + setModalStatus(true); + setStep(3); + return { convertedOgFile: null }; + } }; export default useConvertURLtoFile; diff --git a/src/pages/GiftAdd/GiftAddPage.tsx b/src/pages/GiftAdd/GiftAddPage.tsx index 8afd3947..d1c2cf78 100644 --- a/src/pages/GiftAdd/GiftAddPage.tsx +++ b/src/pages/GiftAdd/GiftAddPage.tsx @@ -6,9 +6,11 @@ import { OpenGraphResponseType } from '../../types/etc'; import { useParams } from 'react-router-dom'; import AddGiftWithLinkLayout from '../../components/GiftAdd/AddGiftLayout/AddGiftWithLinkLayout'; import { useAddGiftContext } from '../../context/AddGift/AddGiftContext'; +import Loading from '../Loading/Loading'; const GiftAddPage = () => { const [step, setStep] = useState(0); + const [isLoading, setIsLoading] = useState(false); // case 1 링크 입력 페이지 state들 const [itemNum, setItemNum] = useState(0); @@ -55,7 +57,9 @@ const GiftAddPage = () => { ); case 2: - return ( + return isLoading ? ( + + ) : ( { link={linkText} openGraph={openGraph} targetDate={targetDate || ''} + setModalStatus={setModalStatus} addGiftInfo={addGiftInfo} updateAddGiftInfo={updateAddGiftInfo} + setIsLoading={setIsLoading} /> ); case 3: - return ( + return isLoading ? ( + + ) : ( { addGiftInfo={addGiftInfo} openGraph={openGraph} updateAddGiftInfo={updateAddGiftInfo} + setIsLoading={setIsLoading} /> ); }