From 7e22e44cadf32fa0cb3e83bca7362fbde8713ecd Mon Sep 17 00:00:00 2001 From: Seyeonnnn <144412217+Seyeonnnn@users.noreply.github.com> Date: Sat, 28 Sep 2024 21:39:42 +0900 Subject: [PATCH 01/17] =?UTF-8?q?=EB=8B=AC=EB=A0=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Mypage/Goals.tsx | 2 +- src/components/Mypage/Goals/Calander.tsx | 347 +++++++++++--------- src/components/Mypage/Goals/DDayCounter.tsx | 99 +++--- 3 files changed, 240 insertions(+), 208 deletions(-) diff --git a/src/components/Mypage/Goals.tsx b/src/components/Mypage/Goals.tsx index 9da95661..3b54b042 100644 --- a/src/components/Mypage/Goals.tsx +++ b/src/components/Mypage/Goals.tsx @@ -18,7 +18,7 @@ const Goals: React.FC = () => { const isSetting = sector === 'setting'; return ( -
+
{/* 목표 점검 및 설정 버튼 */}
{/* 목표 점검 (maintenance) 버튼 */} diff --git a/src/components/Mypage/Goals/Calander.tsx b/src/components/Mypage/Goals/Calander.tsx index d915290b..6e593346 100644 --- a/src/components/Mypage/Goals/Calander.tsx +++ b/src/components/Mypage/Goals/Calander.tsx @@ -1,188 +1,221 @@ -import { useState, useEffect } from 'react'; -import { BsCaretLeftFill, BsCaretRightFill } from "react-icons/bs"; +import { BsCaretLeftFill, BsCaretRightFill } from 'react-icons/bs'; +import { useEffect, useState } from 'react'; + import { API } from '../../../lib/api/index.ts'; -import dayjs from 'dayjs'; import cn from '../../../lib/cn'; +import dayjs from 'dayjs'; interface CalendarDay { - day: number | null; + day: number | null; } interface DayAchieve { - date: string; // "YYYY-MM-DD" - achieved: number; // 0 ~ 4 + date: string; // "YYYY-MM-DD" + achieved: number; // 0 ~ 4 } const monthNames: string[] = [ - '1월', '2월', '3월', '4월', '5월', '6월', - '7월', '8월', '9월', '10월', '11월', '12월' + '1월', + '2월', + '3월', + '4월', + '5월', + '6월', + '7월', + '8월', + '9월', + '10월', + '11월', + '12월', ]; // 히트맵 색상 매핑 함수 const getHeatmapColor = (achieved: number) => { - switch (achieved) { - case 1: - return 'bg-blue-100'; - case 2: - return 'bg-blue-200'; - case 3: - return 'bg-blue-400'; - case 4: - return 'bg-blue-600'; - default: - return 'bg-white'; - } + switch (achieved) { + case 1: + return 'bg-blue-100'; + case 2: + return 'bg-blue-200'; + case 3: + return 'bg-blue-400'; + case 4: + return 'bg-blue-600'; + default: + return 'bg-white'; + } }; const Calendar: React.FC = () => { - const [currentDate, setCurrentDate] = useState(new Date()); - const [calendarDays, setCalendarDays] = useState<(number | null)[]>([]); - const [dayAchieveMap, setDayAchieveMap] = useState>(new Map()); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - useEffect(() => { - const fetchCalendar = async () => { - setLoading(true); - try { - // 현재 날짜 기준으로 월을 형식에 맞게 설정 (예: '2024-09') - const currentMonth = dayjs(currentDate).format('YYYY-MM'); - const response = await API.User.getCalendar(currentMonth); - - if (response.status === 'OK' && response.data) { - const dayAchieveList: DayAchieve[] = response.data.dayAchiveList; - const achieveMap = new Map(); - - dayAchieveList.forEach(item => { - achieveMap.set(item.date, item.achieved); - }); - - setDayAchieveMap(achieveMap); - } else { - setError(response.description || '캘린더 데이터를 불러오는 데 실패했습니다.'); + const [currentDate, setCurrentDate] = useState(new Date()); + const [calendarDays, setCalendarDays] = useState<(number | null)[]>([]); + const [dayAchieveMap, setDayAchieveMap] = useState>( + new Map() + ); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const fetchCalendar = async () => { + setLoading(true); + try { + // 현재 날짜 기준으로 월을 형식에 맞게 설정 (예: '2024-09') + const currentMonth = dayjs(currentDate).format('YYYY-MM'); + const response = await API.User.getCalendar(currentMonth); + + if (response.status === 'OK' && response.data) { + const dayAchieveList: DayAchieve[] = + response.data.dayAchiveList; + const achieveMap = new Map(); + + dayAchieveList.forEach((item) => { + achieveMap.set(item.date, item.achieved); + }); + + setDayAchieveMap(achieveMap); + } else { + setError( + response.description || + '캘린더 데이터를 불러오는 데 실패했습니다.' + ); + } + } catch (err: any) { + console.error('캘린더 데이터를 가져오는 중 오류 발생:', err); + setError( + err.message || '캘린더 데이터를 불러오는 데 실패했습니다.' + ); + } finally { + setLoading(false); + } + }; + + fetchCalendar(); + }, [currentDate]); + + useEffect(() => { + generateCalendar(currentDate); + }, [currentDate]); + + const generateCalendar = (date: Date): void => { + const year: number = date.getFullYear(); + const month: number = date.getMonth(); + + // 해당 월의 첫 날과 마지막 날 + const firstDayOfMonth: Date = new Date(year, month, 1); + const lastDayOfMonth: Date = new Date(year, month + 1, 0); + + // 시작 요일 (0: 일요일, 6: 토요일) + const startDay: number = firstDayOfMonth.getDay(); + const totalDays: number = lastDayOfMonth.getDate(); + + const days: (number | null)[] = []; + + // 이전 달의 빈 칸 채우기 + for (let i = 0; i < startDay; i++) { + days.push(null); } - } catch (err: any) { - console.error('캘린더 데이터를 가져오는 중 오류 발생:', err); - setError(err.message || '캘린더 데이터를 불러오는 데 실패했습니다.'); - } finally { - setLoading(false); - } - }; - - fetchCalendar(); - }, [currentDate]); - useEffect(() => { - generateCalendar(currentDate); - }, [currentDate]); - - const generateCalendar = (date: Date): void => { - const year: number = date.getFullYear(); - const month: number = date.getMonth(); + // 해당 월의 일수 채우기 + for (let day = 1; day <= totalDays; day++) { + days.push(day); + } - // 해당 월의 첫 날과 마지막 날 - const firstDayOfMonth: Date = new Date(year, month, 1); - const lastDayOfMonth: Date = new Date(year, month + 1, 0); + setCalendarDays(days); + }; - // 시작 요일 (0: 일요일, 6: 토요일) - const startDay: number = firstDayOfMonth.getDay(); - const totalDays: number = lastDayOfMonth.getDate(); + const handlePreviousMonth = (): void => { + setCurrentDate( + (prevDate) => + new Date(prevDate.getFullYear(), prevDate.getMonth() - 1, 1) + ); + }; - const days: (number | null)[] = []; + const handleNextMonth = (): void => { + setCurrentDate( + (prevDate) => + new Date(prevDate.getFullYear(), prevDate.getMonth() + 1, 1) + ); + }; - // 이전 달의 빈 칸 채우기 - for (let i = 0; i < startDay; i++) { - days.push(null); + if (loading) { + return
로딩 중...
; } - // 해당 월의 일수 채우기 - for (let day = 1; day <= totalDays; day++) { - days.push(day); + if (error) { + return
{error}
; } - setCalendarDays(days); - }; - - const handlePreviousMonth = (): void => { - setCurrentDate(prevDate => new Date(prevDate.getFullYear(), prevDate.getMonth() - 1, 1)); - }; - - const handleNextMonth = (): void => { - setCurrentDate(prevDate => new Date(prevDate.getFullYear(), prevDate.getMonth() + 1, 1)); - }; - - if (loading) { - return
로딩 중...
; - } - - if (error) { - return
{error}
; - } - - return ( -
- {/* 달력 헤더 */} -
- - -

- {currentDate.getFullYear()}년 {monthNames[currentDate.getMonth()]} -

- - -
- - {/* 요일 표시 */} -
- {['S', 'M', 'T', 'W', 'T', 'F', 'S'].map((day) => ( - - {day} - - ))} -
- - {/* 날짜 표시 */} -
- {calendarDays.map((day, index) => { - // 현재 월과 일자를 기반으로 날짜 문자열 생성 - const year = currentDate.getFullYear(); - const month = currentDate.getMonth() + 1; // 0-based - const dayString = day - ? `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}` - : null; - - // 해당 날짜의 성취도 가져오기 - const achieved = dayString && dayAchieveMap.has(dayString) ? dayAchieveMap.get(dayString) : 0; - - return ( -
- {day} + return ( +
+ {/* 달력 헤더 */} +
+ + +

+ {currentDate.getFullYear()}년{' '} + {monthNames[currentDate.getMonth()]} +

+ + +
+ + {/* 요일 표시 */} +
+ {['S', 'M', 'T', 'W', 'T', 'F', 'S'].map((day) => ( + + {day} + + ))} +
+ + {/* 날짜 표시 */} +
+ {calendarDays.map((day, index) => { + // 현재 월과 일자를 기반으로 날짜 문자열 생성 + const year = currentDate.getFullYear(); + const month = currentDate.getMonth() + 1; // 0-based + const dayString = day + ? `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}` + : null; + + // 해당 날짜의 성취도 가져오기 + const achieved = + dayString && dayAchieveMap.has(dayString) + ? dayAchieveMap.get(dayString) + : 0; + + return ( +
+ {day} +
+ ); + })}
- ); - })} -
-
- ); +
+ ); }; export default Calendar; diff --git a/src/components/Mypage/Goals/DDayCounter.tsx b/src/components/Mypage/Goals/DDayCounter.tsx index ab3570c2..6c312f8a 100644 --- a/src/components/Mypage/Goals/DDayCounter.tsx +++ b/src/components/Mypage/Goals/DDayCounter.tsx @@ -4,55 +4,54 @@ import dayjs from 'dayjs'; import cn from '../../../lib/cn'; const DDayCounter: React.FC = () => { - const [dDay, setDDay] = useState(null); - const [myGoal, setMyGoal] = useState(null); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - useEffect(() => { - const fetchCalendar = async () => { - try { - // 현재 날짜 기준으로 월을 형식에 맞게 설정 (예: '2024-09') - const currentMonth = dayjs().format('YYYY-MM'); - const response = await API.User.getCalendar(currentMonth); - - // dDay 업데이트 - setDDay(response.data.dDay); - setMyGoal(response.data.goal); - } catch (err: any) { - console.error('캘린더 데이터를 가져오는 중 오류 발생:', err); - setError(err.message || '캘린더 데이터를 불러오는 데 실패했습니다.'); - } finally { - setLoading(false); - } - }; - - fetchCalendar(); - }, []); // 빈 의존성 배열로 컴포넌트 마운트 시 한 번 실행 - - if (loading) { - return
로딩 중...
; - } - - if (error) { - return
{error}
; - } - - return ( -
-

- D-{dDay} -

-

- {myGoal} -

-
- ); + const [dDay, setDDay] = useState(null); + const [myGoal, setMyGoal] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const fetchCalendar = async () => { + try { + // 현재 날짜 기준으로 월을 형식에 맞게 설정 (예: '2024-09') + const currentMonth = dayjs().format('YYYY-MM'); + const response = await API.User.getCalendar(currentMonth); + + // dDay 업데이트 + setDDay(response.data.dDay); + setMyGoal(response.data.goal); + } catch (err: any) { + console.error('캘린더 데이터를 가져오는 중 오류 발생:', err); + setError( + err.message || '캘린더 데이터를 불러오는 데 실패했습니다.' + ); + } finally { + setLoading(false); + } + }; + + fetchCalendar(); + }, []); // 빈 의존성 배열로 컴포넌트 마운트 시 한 번 실행 + + if (loading) { + return
로딩 중...
; + } + + if (error) { + return
{error}
; + } + + return ( +
+

D-{dDay}

+

{myGoal}

+
+ ); }; -export default DDayCounter; \ No newline at end of file +export default DDayCounter; From fd742bd6afe50853e367e6bc8c4168ee91686905 Mon Sep 17 00:00:00 2001 From: Yunseok Date: Sat, 28 Sep 2024 22:33:36 +0900 Subject: [PATCH 02/17] =?UTF-8?q?[FEAT]=20-=20=EC=9E=90=EA=B8=B0=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=96=BB=EB=8A=94=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/api/user/index.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/lib/api/user/index.ts b/src/lib/api/user/index.ts index 6c4c5b18..196f613e 100644 --- a/src/lib/api/user/index.ts +++ b/src/lib/api/user/index.ts @@ -80,4 +80,14 @@ export namespace __User { tokenOn: true, }); } + + export async function getMyInfo() { + const url = `${BASE_URL}/user/info`; + + return fetchData({ + url, + method: 'GET', + tokenOn: true, + }); + } } From 7869033552d7a661c1dc20c948607765b0f9d4f5 Mon Sep 17 00:00:00 2001 From: liupei8979 Date: Sat, 28 Sep 2024 22:34:00 +0900 Subject: [PATCH 03/17] =?UTF-8?q?Coding=20=ED=95=98=EC=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Mypage/Goals/SettingGoals.tsx | 18 +++++++++++++++++- src/lib/api/team/index.ts | 12 ++++++++++++ src/pages/goal.tsx | 5 +++-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/components/Mypage/Goals/SettingGoals.tsx b/src/components/Mypage/Goals/SettingGoals.tsx index cbd4a63b..6600d5d0 100644 --- a/src/components/Mypage/Goals/SettingGoals.tsx +++ b/src/components/Mypage/Goals/SettingGoals.tsx @@ -1,12 +1,28 @@ +import { useEffect, useState } from 'react'; + +import { API } from '../../../lib/api'; // API 모듈 경로에 맞게 import import CreateTeam from './Setting/CreateTeam'; // CreateTeam 컴포넌트를 임포트합니다. import InputCodeField from './Setting/InputCodeField'; // InviteCodeField 컴포넌트를 임포트합니다. import NotGood from '../../../assets/NotGood.svg'; -import { useState } from 'react'; const SettingGoals: React.FC = () => { const [showCreateTeam, setShowCreateTeam] = useState(false); const [showInviteCode, setShowInviteCode] = useState(false); + // 화면 렌더될 때 기록 조회 + useEffect(() => { + const fetchHistories = async () => { + try { + const response = await API.Team.getHistories(); + console.log('기록 조회 성공:', response); + } catch (error) { + console.error('기록 조회 실패:', error); + } + }; + + fetchHistories(); + }, []); // 빈 배열을 사용하여 컴포넌트가 처음 렌더링될 때만 실행 + const handleCreateTeamClick = () => { setShowCreateTeam(true); }; diff --git a/src/lib/api/team/index.ts b/src/lib/api/team/index.ts index 2ec28f7b..14835080 100644 --- a/src/lib/api/team/index.ts +++ b/src/lib/api/team/index.ts @@ -57,4 +57,16 @@ export namespace __Team { tokenOn: true, // 인증이 필요한 경우 토큰 포함 }); } + + // 기록 조회 함수 + export async function getHistories() { + const url = `${BASE_URL}/histories`; + + // 서버에서 기록 조회 요청 (GET) + return fetchData({ + url, + method: 'GET', + tokenOn: true, // 인증이 필요한 경우 토큰 포함 + }); + } } diff --git a/src/pages/goal.tsx b/src/pages/goal.tsx index f96a2529..81525147 100644 --- a/src/pages/goal.tsx +++ b/src/pages/goal.tsx @@ -1,8 +1,9 @@ import { useEffect, useState } from 'react'; -import NeedLoginComponents from '../components/NeedLoginComponents.tsx'; + import GoormScreen from '../components/Goalpage/GoormScreen.tsx'; -import cn from '../lib/cn.ts'; import MemberList from '../components/Goalpage/MemberList.tsx'; +import NeedLoginComponents from '../components/NeedLoginComponents.tsx'; +import cn from '../lib/cn.ts'; export default function Goal() { const [isLogin, setIsLogin] = useState(false); From 69772a8b275188d48aee95d4dd27cac8a41f4ba4 Mon Sep 17 00:00:00 2001 From: liupei8979 Date: Sat, 28 Sep 2024 22:48:55 +0900 Subject: [PATCH 04/17] =?UTF-8?q?[FEAT]=20-=20Button=20disabled=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Goalpage/GoormScreen.tsx | 26 +++++++++---------- src/components/Goalpage/MemberList.tsx | 1 - .../Goalpage/MemberList/ShowImageModal.tsx | 25 +++++++++++------- src/components/Header/Header.tsx | 2 +- .../Mypage/Goals/Setting/InputCodeField.tsx | 18 ++++++++++--- 5 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/components/Goalpage/GoormScreen.tsx b/src/components/Goalpage/GoormScreen.tsx index 4945c392..78dde855 100644 --- a/src/components/Goalpage/GoormScreen.tsx +++ b/src/components/Goalpage/GoormScreen.tsx @@ -80,33 +80,33 @@ export default function GoormScreen() {
- {clouds.map((cloud, index) => ( -
diff --git a/src/components/Goalpage/MemberList.tsx b/src/components/Goalpage/MemberList.tsx index f6c1fcb4..fdb4e7a6 100644 --- a/src/components/Goalpage/MemberList.tsx +++ b/src/components/Goalpage/MemberList.tsx @@ -7,7 +7,6 @@ interface Member { username: string; } - export default function MemberList() { const [members, setMembers] = useState([ { id: '1', username: '김' }, diff --git a/src/components/Goalpage/MemberList/ShowImageModal.tsx b/src/components/Goalpage/MemberList/ShowImageModal.tsx index 3bf72434..4261e309 100644 --- a/src/components/Goalpage/MemberList/ShowImageModal.tsx +++ b/src/components/Goalpage/MemberList/ShowImageModal.tsx @@ -15,7 +15,11 @@ interface ImageData { alt: string; // 이미지 대체 텍스트 } -export default function ShowImageModal({ memberId, memberName, onClose }: ShowImageModalProps) { +export default function ShowImageModal({ + memberId, + memberName, + onClose, +}: ShowImageModalProps) { // 백엔드에서 가져온 이미지들을 저장할 상태 const [images, setImages] = useState([]); @@ -53,11 +57,14 @@ export default function ShowImageModal({ memberId, memberName, onClose }: ShowIm }, []); // 가져온 이미지와 기본 이미지를 결합하여 최대 4개의 이미지를 생성 - const displayImages = [...images, ...Array(4 - images.length).fill({ - id: 'no-image', // ID 대신 'no-image'로 채움 - url: NoImage, // 기본 이미지 URL - alt: 'No Image Available', // 대체 텍스트 - })].slice(0, 4); // 최대 4개까지 표시 + const displayImages = [ + ...images, + ...Array(4 - images.length).fill({ + id: 'no-image', // ID 대신 'no-image'로 채움 + url: NoImage, // 기본 이미지 URL + alt: 'No Image Available', // 대체 텍스트 + }), + ].slice(0, 4); // 최대 4개까지 표시 return (
))} @@ -89,7 +96,7 @@ export default function ShowImageModal({ memberId, memberName, onClose }: ShowIm From 17edd21b27c2bbdc52152f3be7ee3fc8409c5dd1 Mon Sep 17 00:00:00 2001 From: liupei8979 Date: Sat, 28 Sep 2024 23:03:21 +0900 Subject: [PATCH 05/17] =?UTF-8?q?[FEAT]=20-=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=8B=A4?= =?UTF-8?q?=EC=A0=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Mypage/Profile.tsx | 52 ++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/src/components/Mypage/Profile.tsx b/src/components/Mypage/Profile.tsx index 8d33ead9..908678e2 100644 --- a/src/components/Mypage/Profile.tsx +++ b/src/components/Mypage/Profile.tsx @@ -1,13 +1,57 @@ +import { useEffect, useState } from 'react'; + +import { API } from '../../lib/api'; // 적절한 경로로 __User import + export default function Profile() { + const [userInfo, setUserInfo] = useState<{ + nickname: string; + profileImageUrl: string | null; + }>({ + nickname: '', + profileImageUrl: null, + }); + + // 화면이 렌더될 때 getMyInfo API 호출 + useEffect(() => { + const fetchUserInfo = async () => { + try { + const response = await API.User.getMyInfo(); + setUserInfo({ + nickname: response.nickname, + profileImageUrl: response.profileUrl, + }); + + console.log('사용자 정보:', response); + } catch (error) { + console.error('사용자 정보를 가져오는 데 실패했습니다.', error); + } + }; + + fetchUserInfo(); + }, []); + return (
-

프로필

- {/* 사진 영역 */} -
+
+ {userInfo.profileImageUrl ? ( + 프로필 이미지 + ) : ( +
+ {/* 프로필 이미지가 없을 경우 기본 이미지 또는 텍스트 */} + 이미지 없음 +
+ )} +
{/* 닉네임 */} -

홍길동

+

+ {userInfo.nickname || '닉네임 없음'} +

{/* 프로필 수정 버튼 */} ); } From 8d9b9d5b3f553d3fc064e0cdb35a0a96195bffd6 Mon Sep 17 00:00:00 2001 From: liupei8979 Date: Sat, 28 Sep 2024 23:46:35 +0900 Subject: [PATCH 08/17] =?UTF-8?q?[FEAT]=20-=20header=20=EA=B3=A0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 2 +- src/components/Header/Header.tsx | 2 +- src/pages/_layout.tsx | 9 ++++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 8bafe4e8..20805bb2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,5 @@ -import { BrowserRouter } from 'react-router-dom'; import { Analytics } from '@vercel/analytics/react'; +import { BrowserRouter } from 'react-router-dom'; function App() { return ( diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 1dacb7a1..833acaf9 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -52,7 +52,7 @@ export default function Header() { className={cn( 'bg-white flex items-center justify-between', 'h-[75px] md:h-[150px] p-2 md:px-20', - 'border-b-2 border-[#DBDBDB] relative' + 'border-b-2 border-[#DBDBDB] fixed top-0 left-0 w-full z-50' // 수정: 헤더를 화면 상단에 고정 )} > {/* 로고 영역 */} diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index fdaf4e3e..35e47acb 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -14,9 +14,12 @@ export default function NotFoundPage() { return (
- - - + {/* 헤더의 높이만큼 상단에 패딩을 추가 */} +
+ + + +
{!hideFooter &&
}
); From a577ac1c68cbc4e896d63b8adba33347d53a2202 Mon Sep 17 00:00:00 2001 From: liupei8979 Date: Sat, 28 Sep 2024 23:49:42 +0900 Subject: [PATCH 09/17] =?UTF-8?q?[STYLE]=20-=20Header=20border=20bottom=20?= =?UTF-8?q?shadow=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Header/Header.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 833acaf9..2fcf6faa 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -52,7 +52,8 @@ export default function Header() { className={cn( 'bg-white flex items-center justify-between', 'h-[75px] md:h-[150px] p-2 md:px-20', - 'border-b-2 border-[#DBDBDB] fixed top-0 left-0 w-full z-50' // 수정: 헤더를 화면 상단에 고정 + 'border-b-2 border-[#DBDBDB] fixed top-0 left-0 w-full z-50', + 'shadow-md' // 추가: 그림자 효과 )} > {/* 로고 영역 */} From 8abbb0e08f75781a8ce24da6e01c2c26c9dc9ea7 Mon Sep 17 00:00:00 2001 From: Seyeonnnn <144412217+Seyeonnnn@users.noreply.github.com> Date: Sun, 29 Sep 2024 00:00:06 +0900 Subject: [PATCH 10/17] Update ShowImageModal.tsx --- src/components/Goalpage/MemberList/ShowImageModal.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Goalpage/MemberList/ShowImageModal.tsx b/src/components/Goalpage/MemberList/ShowImageModal.tsx index 1bdabbca..04481935 100644 --- a/src/components/Goalpage/MemberList/ShowImageModal.tsx +++ b/src/components/Goalpage/MemberList/ShowImageModal.tsx @@ -89,7 +89,6 @@ export default function ShowImageModal({ 'flex justify-center items-center w-[80vw] md:w-[80vw]', - 'flex justify-center items-center w-[80vp] md:w-[80vp]', 'h-32 md:h-48 object-cover rounded' // 이미지 스타일링 )} From ee796baaced0816792c2d09bb4b98138afd17284 Mon Sep 17 00:00:00 2001 From: Yunseok Date: Sun, 29 Sep 2024 00:07:33 +0900 Subject: [PATCH 11/17] =?UTF-8?q?[STYLE]=20-=20=EA=B5=AC=EB=A6=84=EC=97=90?= =?UTF-8?q?=20=EC=97=90=EB=8B=88=EB=A9=94=EC=9D=B4=EC=85=98,=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=86=8D=EB=8F=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 대신 구름이 파랑색이 안되버림 ㅠ --- src/components/Goalpage/GoormScreen.tsx | 110 +++++++++++------- .../Goalpage/GoormScreen/CloudComponent.tsx | 32 +++-- 2 files changed, 91 insertions(+), 51 deletions(-) diff --git a/src/components/Goalpage/GoormScreen.tsx b/src/components/Goalpage/GoormScreen.tsx index 4945c392..e2f0be2d 100644 --- a/src/components/Goalpage/GoormScreen.tsx +++ b/src/components/Goalpage/GoormScreen.tsx @@ -1,10 +1,11 @@ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import cn from '../../lib/cn'; import BlueCloud from '../../assets/GoalPage/BlueCloud.svg'; import ColorCloud from '../../assets/GoalPage/ColorCloud.svg'; import Rainbow1 from '../../assets/GoalPage/Rainbow1.svg'; import Rainbow2 from '../../assets/GoalPage/Rainbow2.svg'; import CloudComponent from './GoormScreen/CloudComponent'; +import { API } from '../../lib/api/index.ts'; interface Cloud { cloudType: string; @@ -15,28 +16,59 @@ interface Cloud { export default function GoormScreen() { const [stage, setStage] = useState(0); + const [myId, setMyId] = useState(''); + + useEffect(() => { + const fetchMyData = async () => { + try { + const response = await API.User.getMyInfo(); + + if (response.status === 'OK' && response.data) { + // 사용자 ID 설정 + setMyId(response.data.id); + + // 'data' 배열이 존재하고 배열인지 확인 후 길이 설정 + if (response.data.data && Array.isArray(response.data.data)) { + const dataCount = response.data.data.length; + setStage(dataCount); + } else { + // 'data' 배열이 없거나 배열이 아닌 경우 0으로 설정 + setStage(0); + } + } else { + console.error('응답 상태가 OK가 아니거나 데이터가 없습니다.'); + setStage(0); + } + } catch (error) { + console.error('내 정보를 불러오는 중 오류가 발생했습니다:', error); + setStage(0); + } + }; + + fetchMyData(); + }, []); const clouds: Cloud[] = [ { - cloudType: stage === 1 ? ColorCloud : BlueCloud, + cloudType: stage >= 1 ? ColorCloud : BlueCloud, colStart: 1, rowStart: 1, - hidden: stage === 0, + hidden: stage < 1, }, { - cloudType: stage === 2 ? ColorCloud : BlueCloud, + cloudType: stage >= 2 ? ColorCloud : BlueCloud, colStart: 2, rowStart: 2, hidden: stage < 2, }, { - cloudType: stage === 3 ? ColorCloud : BlueCloud, + cloudType: stage >= 3 ? ColorCloud : BlueCloud, colStart: 3, rowStart: 1, hidden: stage < 3, }, { - cloudType: stage === 4 ? ColorCloud : BlueCloud, + cloudType: stage >= 4 ? ColorCloud : BlueCloud, colStart: 4, rowStart: 2, hidden: stage < 4, @@ -48,65 +80,59 @@ export default function GoormScreen() { setStage((prev) => (prev < 4 ? prev + 1 : prev)); }; - // 임시로 집어넣은 구름 단계 감소 함수 - const decreaseStage = () => { - setStage((prev) => (prev > 0 ? prev - 1 : prev)); - }; + // 구름 증가시키는데 천천히 증가하도록 설정 + useEffect(() => { + if (stage < 4) { // 최대 스테이지가 4라면 + const timer = setTimeout(() => { + increaseStage(); + }, 1000); + + return () => clearTimeout(timer); + } + }, [stage]); return (
- {/* 단계 조절 버튼 */} -
- - -
-
- {clouds.map((cloud, index) => ( -
diff --git a/src/components/Goalpage/GoormScreen/CloudComponent.tsx b/src/components/Goalpage/GoormScreen/CloudComponent.tsx index 8664945e..d681c49b 100644 --- a/src/components/Goalpage/GoormScreen/CloudComponent.tsx +++ b/src/components/Goalpage/GoormScreen/CloudComponent.tsx @@ -1,3 +1,4 @@ +import React, { useEffect, useState } from 'react'; import cn from '../../../lib/cn'; import CloudDisk from '../../../assets/GoalPage/CloudDisk.svg'; import ColorCloud from '../../../assets/GoalPage/ColorCloud.svg'; @@ -9,17 +10,28 @@ interface CloudComponentProps { hidden: boolean; } -export default function CloudComponent({ +const CloudComponent: React.FC = ({ cloudType, colStart, rowStart, hidden, -}: CloudComponentProps) { +}) => { + const [currentCloudType, setCurrentCloudType] = useState(cloudType); + + useEffect(() => { + // cloudType이 변경될 때마다 currentCloudType을 업데이트 + setCurrentCloudType(cloudType); + console.log('cloudType:', cloudType); + + // 이 부분에 cloudType이 변경될 때 수행할 추가 작업을 넣을 수 있습니다. + // 예: 애니메이션이나 효과 등 + }, [cloudType]); + return ( ); -} +}; + +export default CloudComponent; From e1ee537c52202f881c56e9022c993bd3c8e0ab5f Mon Sep 17 00:00:00 2001 From: Yunseok Date: Sun, 29 Sep 2024 00:16:37 +0900 Subject: [PATCH 12/17] =?UTF-8?q?[FIX]=20-=20=EA=B5=AC=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=ED=9A=A8=EA=B3=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Goalpage/GoormScreen.tsx | 57 ++++++++++--------- .../Goalpage/GoormScreen/CloudComponent.tsx | 17 +----- 2 files changed, 34 insertions(+), 40 deletions(-) diff --git a/src/components/Goalpage/GoormScreen.tsx b/src/components/Goalpage/GoormScreen.tsx index e2f0be2d..897dfac7 100644 --- a/src/components/Goalpage/GoormScreen.tsx +++ b/src/components/Goalpage/GoormScreen.tsx @@ -17,6 +17,7 @@ interface Cloud { export default function GoormScreen() { const [stage, setStage] = useState(0); const [myId, setMyId] = useState(''); + const [clouds, setClouds] = useState([]); useEffect(() => { const fetchMyData = async () => { @@ -48,32 +49,36 @@ export default function GoormScreen() { fetchMyData(); }, []); - const clouds: Cloud[] = [ - { - cloudType: stage >= 1 ? ColorCloud : BlueCloud, - colStart: 1, - rowStart: 1, - hidden: stage < 1, - }, - { - cloudType: stage >= 2 ? ColorCloud : BlueCloud, - colStart: 2, - rowStart: 2, - hidden: stage < 2, - }, - { - cloudType: stage >= 3 ? ColorCloud : BlueCloud, - colStart: 3, - rowStart: 1, - hidden: stage < 3, - }, - { - cloudType: stage >= 4 ? ColorCloud : BlueCloud, - colStart: 4, - rowStart: 2, - hidden: stage < 4, - }, - ]; + useEffect(() => { + const newClouds: Cloud[] = [ + { + cloudType: stage === 1 ? ColorCloud : BlueCloud, + colStart: 1, + rowStart: 1, + hidden: stage < 1, + }, + { + cloudType: stage === 2 ? ColorCloud : BlueCloud, + colStart: 2, + rowStart: 2, + hidden: stage < 2, + }, + { + cloudType: stage === 3 ? ColorCloud : BlueCloud, + colStart: 3, + rowStart: 1, + hidden: stage < 3, + }, + { + cloudType: stage === 4 ? ColorCloud : BlueCloud, + colStart: 4, + rowStart: 2, + hidden: stage < 4, + }, + ]; + + setClouds(newClouds); // 새로운 clouds 배열로 업데이트 + }, [stage]); // stage가 변경될 때마다 실행 // 임시로 집어넣은 구름 단계 증가 함수 const increaseStage = () => { diff --git a/src/components/Goalpage/GoormScreen/CloudComponent.tsx b/src/components/Goalpage/GoormScreen/CloudComponent.tsx index d681c49b..33d5c8d1 100644 --- a/src/components/Goalpage/GoormScreen/CloudComponent.tsx +++ b/src/components/Goalpage/GoormScreen/CloudComponent.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect } from 'react'; import cn from '../../../lib/cn'; import CloudDisk from '../../../assets/GoalPage/CloudDisk.svg'; import ColorCloud from '../../../assets/GoalPage/ColorCloud.svg'; @@ -16,17 +16,6 @@ const CloudComponent: React.FC = ({ rowStart, hidden, }) => { - const [currentCloudType, setCurrentCloudType] = useState(cloudType); - - useEffect(() => { - // cloudType이 변경될 때마다 currentCloudType을 업데이트 - setCurrentCloudType(cloudType); - console.log('cloudType:', cloudType); - - // 이 부분에 cloudType이 변경될 때 수행할 추가 작업을 넣을 수 있습니다. - // 예: 애니메이션이나 효과 등 - }, [cloudType]); - return (
= ({ }} > 구름 = ({ className={cn( 'w-1/4 h-1/4 md:w-[288px] md:h-[156px]', 'absolute mt-20 md:mt-[200px] transition-opacity duration-500', - currentCloudType === ColorCloud ? 'opacity-100' : 'opacity-0' + cloudType === ColorCloud ? 'opacity-100' : 'opacity-0' )} style={{ zIndex: 0 }} /> From b78275230601a0e0374c11b531844518de170fb4 Mon Sep 17 00:00:00 2001 From: Yunseok Date: Sun, 29 Sep 2024 00:24:01 +0900 Subject: [PATCH 13/17] =?UTF-8?q?[FIX]=20-=20D-Day=20=EA=B9=A8=EC=A7=90=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Mypage/Goals/DDayCounter.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Mypage/Goals/DDayCounter.tsx b/src/components/Mypage/Goals/DDayCounter.tsx index 6c312f8a..acc0ef3e 100644 --- a/src/components/Mypage/Goals/DDayCounter.tsx +++ b/src/components/Mypage/Goals/DDayCounter.tsx @@ -45,11 +45,11 @@ const DDayCounter: React.FC = () => { className={cn( 'bg-white p-4 rounded shadow text-left mb-4', 'flex flex-row items-center justify-left gap-4', - 'w-40 h-14' + 'w-60 h-14' )} >

D-{dDay}

-

{myGoal}

+

{myGoal}

); }; From cd81183bbf1cb1b5028c6e1d07782b85f4d4ce6a Mon Sep 17 00:00:00 2001 From: liupei8979 Date: Sun, 29 Sep 2024 00:26:14 +0900 Subject: [PATCH 14/17] =?UTF-8?q?[FEAT]=20-=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=ED=8C=AC=EB=94=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/loading/1.png | Bin 0 -> 26271 bytes src/assets/loading/2.png | Bin 0 -> 29662 bytes src/assets/loading/3.png | Bin 0 -> 27000 bytes src/components/Pending/Loading.tsx | 55 +++++++++ src/pages/goal.tsx | 46 +++++--- src/pages/guide.tsx | 99 +++++++++------- src/pages/index.tsx | 23 +++- src/pages/login.tsx | 135 ++++++++++++---------- src/pages/mypage.tsx | 61 ++++++---- src/pages/register.tsx | 175 ++++++++++++++++------------- 10 files changed, 380 insertions(+), 214 deletions(-) create mode 100644 src/assets/loading/1.png create mode 100644 src/assets/loading/2.png create mode 100644 src/assets/loading/3.png create mode 100644 src/components/Pending/Loading.tsx diff --git a/src/assets/loading/1.png b/src/assets/loading/1.png new file mode 100644 index 0000000000000000000000000000000000000000..70163201b95c5b24f9f1b43220f4ba6188e287b8 GIT binary patch literal 26271 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 PQwX}Ip|4)1W*hQ9s>{{= literal 0 HcmV?d00001 diff --git a/src/assets/loading/2.png b/src/assets/loading/2.png new file mode 100644 index 0000000000000000000000000000000000000000..e414cd8bd6113d1e51e8bf52efc9abc94fbee750 GIT binary patch literal 29662 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 Rmmj!LzNdb-T){Nx{{a{VWn=&V literal 0 HcmV?d00001 diff --git a/src/assets/loading/3.png b/src/assets/loading/3.png new file mode 100644 index 0000000000000000000000000000000000000000..386d7b0917f00cf63fddfa250a86d9eb1ea99f39 GIT binary patch literal 27000 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

5N+0%*R4E=GP$N<-`A! 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

dlRfS7V&s78vi#l2(}!zx0QaJzLSM z{z6jyL%itB4u<|sSP(zhuWJ!~8Vc3D8@?cWfxDR6{ZX$QCFS`N8d-)Ht`9QS6MCxf zVxXUjj9+iAeh(w8R~jaTe^0EEZI&RF=pX)!4sT`^K;@0i|A>#}1Sojfd_36&{wi zg2m1(tIL0XI@~JyR3&mEIPHSr#myeIiieyVJG@mLmT*isi}UK5-dW&;FKl5@9wX;j zfuluchznhKbKq9{FR)-l#coF->J_pI`ccsMlpkO^@ibMV_k(<14&DFru=ak`0L;lPc4 zkKXUt)X2~XNl7nNN+ct3=~81B-aFet6s=;I5Y<*(=o|da?pp-nGB7pevk;Zmm-?+X zvY6A+X1w7dEb}6#=qFFbMasqK*K?N9({YS_{Thy95WYB@JicJcraSn*<-cT>Tnzs` z^Az8PqMnMgHu$e>zoL>|U8^w0>i)!-gsJMi3wkYawGnEo8N*ObSG}z1Juhal4?E-h zc@j?x9WM79{4A2ItOI8w7r`4pKX01{x!ET zF3aAPP;{*OP92}9*RZS^@bX@sef`UUJC--8QO_+4uAE42+$m&hPp0$p%H#<;IOU(u z!Zq-R;}3(j4(B&(w~B^b-qOzvsJt4|c({UUPQEz25Ts`Jm0^Bw5)|-!>QMGV7PRV~ z=Y)m}LfU#g=(JEc-u*sO78J9VObu%6)Ht8kluTE<+v40$m~%Yn2=#|`!VewBTn5y|hm$4@-mEse zzgU&j{IXd)d$!pQ76@%w)NBsMT$@KPlvcM7MpV?3R@dJVR?t8fX;m5t-I*TCVV$}R z%B1zh$e#OHz?fIb4$QXv3@+ccZA~U8zSm6JIZh^>+te+_St#|-x6VbB1kEN_S+>G! zbiZhf1~n8NdlY&XA8*=fyl4SGGYJrip$WLmHUEJI=3g?v*9y63@j2zQ6x+r8@59G` zQu9Rt=U9aj%k95aNs_BU#3JUntqzIA*Vx`uF7S+L=wGlOA~& z6N=o;cJF>S^Z27!E`zIJmS=O}dF~seL(p*zF|{7YLtNA*?jM@&?jMOWUA(+J{I}L; zGI=~-2Ah`cgk;XtKw^F!cNS=R%|IajsAo!+F;xsK_>nh>gnq+Zy{)F+3d(AM8+%42= zTal@4TKG(F!*91blViZTb2jjJySIrS&GBvaL0O=uz+h>}RIWw9B9CK&obbSx3*m;H zz=Vivs$JL{-}LYiraSwi8PUZJ2WmJgvf=ppN{isL&%J(-SzF6%`o$8WuBw+9Olt*v z+=0Cne`Ol4-X0kllT=KL=bdh<5u2nUnezp+HyKfvMh~Jyidi%9lbzgOE`xl3V)R@f z=ux6w2coDcP(->wnI${bzTUfwGM-8>A;9u`VRzkJP}o^s)OD2G&_zyLg!( zXT}58%y7t&yU1l^r@3)P+Zbvq3YF_s$f}cq-$C?JjSeM@l7yCQI<7w(?o7BEr0$2_ zP8dy>ez?>xX5oQ#X#~_AeK-4fpTA3_U;Lp*bT(4h8@M#gJ3U2h$l~=ZW6ILht79U) z;UU%8)6t*1Ut8kkO-^RA%UsAFK!^uF)o~}jw6ndONW5cU$2s_=ZK0TYi-ruB6a4QZ z0xXupdbd6EbZd_^voNu!{%U z*!NqcI2{kWSLh4fG26X7Ce6ciOwgtzB2(<|{6>gEyt4c0T4B<~o`=A|SAMq%*ek2m zbnbzPp8GmN44|pTgLitRcml1KbUC@{DPkr`=9(XC#IafKFQA{Tdr-wEn?l* zQ#VunOGPi@!L)Yyvt#|@n#@6S-wO+8nv;cz!vp8HYN&e}oEI;bYK~S&w@?Oa`lM&M zL{R$14O^uZ#%l=>U=1!u1VoNw@R_q z1e6#2gtu(Iy;%^iImx&?Dsa$i3j-*=`iF0>7ss@T@eBP483}#xN_e{ceE2VuWbthI z)>+Beu|Y7SKwo(9=`ZGRTb%ip>F(-HrQG2$v0#m9`ygCOU$PuIz1|3OWJZi4S+(Nu z=tIsi_~7|feW)D5lb_L`xT>9Mle~9C#p`G#?&#ultASNHnvFb>CoPIl9d+?Q2{VcM zCVG}gKb9`BqaA>24;mKF6nH@$(`R1y>7X-xc3Yg&$3q4D*0so_x(?s}xLbwxq zmRz4x-f6c1KY~DNPh%B7Ob82eHq4EwZ?<3xM?Cpy`?~Ah24rWSVX#x-Gyx*#i+$g2 z8Gh3;Sm@<3W1WWHcv`butn#bKEGf+U_ZHn=Xk7Wb*5`2mRZ>Kmt8>DiS<)^(MjGo(X_-{fH&R|&O zUrZ2BXCCWDQTj`R^;Z3a`Q+dn_6hCv2XbLc|LfD1e{H2?HAg)wwUdZuxT6>puKKLj1eKlrsawv-@W+qE#Jo%(LGfmEja16w zSC;JkYi@V2jz<}B0Ofz`{@^QeF4tCN!OM*@XV7@zEC1+4l`PnTE^(`5gE!9`lhts~ zqTL1hkq-*^lwolb_q4`Drx$}NXe}e})d>xWdq;~?K~8HKj}tt44LIy|qzA<=qMyGK zGTSX+-6ib!RWI8v&(x$x`t%UfcYhtB-5W8s!vk`T0o(i*(Pz*@sIC4o_~9N!F;0vm z%02K^IWe%m(|6GkRpPePIp?u1WX9VJ5qVNz@UU(4a3>5$=@uouzUoXOCzkDca&da$ z_S~h^Lr5sh6kyI2NU>0G(Evew8PA7^@;>v=Y!@A^^f^#2VO)Wz2&wI~iWE zctAve>48CN8LZMW*8LGRTJlXb{e00Gbd&_3)OwgynbW(kcy%-Ga_CN2b+(Yy^1$b+ zA&va&&_=#JHw~v>V0N~T5_tRnGYxdOGIQ3nO5+6occF@H7R!DOHuoYpSY6$AocR=1D4AamAV#ouG^%b{5d4Jg?Yl7w>@$FNO4gUl9 zg3uV7V$;EC0k5Z|f3{z+U!SF3hk$cNWZAQu1sT)AQhg87Qhbg_lfQn~^xR(lhEw1$ z;<)7=)v)Zi6}dipya~yqEVFsZXu5J4^ssE^SU51}1o*Mp&b{11uiBf5?O0*fn;1#v zyagnE_bWA6ZL=)cdJ{`Tfi@n$?_52rF$pmm#ko#$AJ9x=f9C#~Utgv1G5cXCbPYl| z8wA^kWU2Njanf;r!3xo@XrD39So?*}SD0)y9>?8+ww)cH`Q%ZK*4oecs91X|8T7a2 zs3%D#W%Z6zOZTA$>6%`zFG@-HeVY@vkaKFEna~DGMzzMHpDbZDDENU{!0Pd>r2M`z z`(M*z9cL%SXItC9n*6eMOSftnpA05QG_$PI7}>p3>h_Hy7(q@9!Vdyw1HR3PTEz4$ zmF-{VWrfTuC%Fgv{h4DfG=zCk-?3*~Qq#`q zA_xIwLm)+9e2$`mXhena)8)@;O?s1Dtg9QwC(mw{IOWmmCh~+-ADSL-E?6Jsw+axe z^IpDBEM*a+ba|z>;G%viKd!+!p!gFuv9?RqG4dDZub$$@>%4R`jB1j*+Nb7c<*qC0 zV1=5wt>$b?nfP1QrZA3^97QlVI+gB|s7e2=3Z`m2y<)855}kRe zso079UXPM<{dJv$$0jG!{ByqLSXbet554m1D}y$Dl`o30wOr0; z;

ma{&(R;Rl^hFykFBPEQjbxX!``ZO*3Tmd&m*`UOjS7H?=rC z+(2YsNcFPY@ytg%y5{TkdmROXyzu?PwGYTX`LFZ?x~B-DG$^u=(J|4)v!(-*Z_aIK zd!@xzX0sxeHBE*M!e@@9xQ-+A{xXms#yU>6C%NH&a631E1 z(D?euWlyV#3jrbTUBgR~Q1B*i%^0Iex?6uBNh?ovQ*U9l7stATiw~XodKCiZ$in9Q zRpnItUs?tf>p_UE9eg({4!YxmjMEp#C?MQ}AzT=G)QQm>j=1p;6s+00BBuxLoOWd| zl)3n%4SJD_dTA&2Y(%x+6IF;HN<&*@o$kd9k@;)OFV=75u#D@BZjEm|z9|w|hMLdNi;%?uq-}gIZmR312+*A+ zZM5nXWX<6{hx0z?QsDf^hZ>XfZ~15VmY$8bgm7sC5)G=NE3q?p#t{QB7m%Kq(5J?3 zxR60LI8mt`Ix$$X^8ghQUU!@_ME*kae+nsxd&_3@m_tOh2iI zWT5Dv?Xu5TPEAYOfp`|J%P$g5%PD;^zjR@%$5>}VV)K%YEKkkfXzv(WdjVF$K+9U- z>N@DGCN5?2iEMb2QS#0K_btv)H0RP*l zr&2mOt^AR8#(F1Pw{>mkvSk{qlEEK~)E`GhsGS%blITJq+;gWQwYcg+aLp)SG4qnx zFxNRyTq+De1odILo&Gc8GGEg z_0-_Xnt)IL^z3a&LO-1A(riA$KmsywYs&zGY^>H}wGFb&f0(E;^+qsXurt^6^f`x~ zaCTC6F0lu4t6Kmo)k)f{{(Y9e9P7PZcmpLURqgi>vJx?33Of!-?qKpQFnKO|bi$=U z1(*0cXf1D~a0)hF4jm)Aley10A!zF~Z~YS^7U}mYy{gJy0pez{w2T=5$g$Kp>u*Wk zogrTNgR%wn%v})gB+l?!X%Vg&VRjQ2}|eflwRhuaZ);)-*3<5oj|DS8+8rP#ZCX zD@`)GQsH#Ub$2#%gu+KJ7^21<2JZ0GZl-NfKooiUS${}vToeJi!4qB`DPkA{oK`v9 z!-|I}E-d|MxHY7v=x%83^S8pl15FWe*WP##tFSN;K(Wb3A{}LN_@PBt##D?dHN50h zR3+DU<-JLWZLW9<(*EG62>BABp``UJZ2L33gFySqfi8iQFK+qMBR4>K$YLgiA#DgqRlk5z#S zz-@0T2>D|&GPtMHfTsRwa3{m&>0txLaf?n-Sm9>QFZ5NRJdTLqgOSph{~f6^N(7td zN*dFT3{&<1ilBanjdH$@)}DZ|z!_orM zv#K=??qVNhV|~>s2zALMY^PS3Ov|5>)Z8;6%y)$(x``t^$y|*nHhMu(BBDaHcn@@D zQc1nX-V#?L)R|53ezF=pZK&qhIJeF% zfKyrfL~HMr@3!zjQt~#0e5S;RyZ>Gqi4xrtuq`mGNvduV#l3a0 zRvyB~FXh=T<)HV9hy3-UIff%GPNj$#)AEeEKTin*?Yei4yAq>L^|J`gh5ZjC7_Tb7 z-Yeh2O0ymLZ#)es)B0rbd{qE=oa=IL8#6){2W=_iL3 zVQ6YBA@#KuRIlbcvFYpU{LMdu)`xS(+gxr0*4gxu)N(IDdkFY^SC@=F`t&@$b%Ub83Nq5-O?A9h@c|O}LIE8L_j5Xg zW`yHK1==!XhKx=mMKU@G^;QsV)AT~sj5Ue7S2E{^`h4>FbCT+${MW>C3i)%^{*-v7 zd771%=`9c0C*ed=LkQ<70ocpH*sUex+*?*0NYir2*x)RDm4v45lZmA-eD8*Ggmmm_ zbc`$0vOty}raxVZq?1-iU`dU9*qoNnU2KrwoO6~Y=iLWkZ`|I{x1|W&SqY8D-+$6y zZ-<45K$E6!;}_hy{>Da?++%hBHE^fTx&)fQ>0-!Epid5tO_n4l-0)Mf3mhX+cQdn@ z;&4IbIY!ly4i0ecVWy#NT;YOkXdI zuH^D7XVcCW88-lDr)=6a&CK1;1nMrwzqcoq0Aeg$sb$k#>|^~11$!~Q2wgFQ-&d@C zpEr6XC2dYjbXF@$BvMgUNz-H?!^2Ax3r)RW8LcS`kil~(~1q;8YOIDF;m`mpuFnK8#gpd*Gr$hdl5)L|Bm z!&Ao;LEG>4OrO1SlPel6QNruD2UO|3;`)$i&}WdcU-h<^+snlB-o{$?ya;4AgQ{rMO4S;jR4$ON&J7tBlRn+@vtq!nhn=R2F5P1 zRm65*dPsQj@;Cexw%Xj9R!y;X(~Kz(0{Jubcis&PlBd$4%0jymL4;h~a_-F;RWdjC zsIl`3C}9POXo>w>YDI`XBpk@KA(YPqlX!jQH;a0NR5Rdb*FmX+!VhPSg%R|R@V$vN z{;Xf?*w+yfmgdnofWnX0W1GsI2J4gk;o#JNwZs5vr!{v)8WrmE0{~QkK&Wd=l=7?Jca@OTC~|So zFlu7i}7IRw6B0I|L|d$jQKbHM3mzlbf<&+fwu^3Sq> zARkbF`W#Gt{EpMlZr4R=n))(mS{`4l^Yi1S?p8?p6?@-6YE;lZ>*u~QC zvVf}r5s0lmbDkWnc{wSw+4p`DgH8Ztt;pDK;#Pt!Nop%FOc4`c!-R0Z>>TUK{q_}_ zM30K|^81Sfaq|v4+z}*MYDp3s**&WG9j|<4I3~WRQ5&^1$pJPz7kR%4`d349JSQjs zNHqdkT=K=OQZgbW*NkG6WYt=OTtFtReMf|X9-|T06$#LLVL7v~RF8ef35Db@_-(Rt z4+frsKXdMq;~%fA?8d||1Wd1#^Y7h@7N!I#_QwwIu$lNl-O|3W!DbH`z)S>ccKyNm zLq%3;r0p%U&sv~>g)8m1=x7#Bu!<>(FT!h}oPmQXNLhD#05rKp8`a7Q>@u@z=X>lG ze(06&cat3?OWa>!n#}z`9V6|51+HDqoNj4NFow`{5aapqubuJ30j9&HwhgQ<-XvCR!s{$2K$zn4SjaCCV8i=~~e{GhCZz$YYkKs5CA8U-ZGuHh$qxmk} zxa_#OsMsoY4nL#q<$mi^R~X+1u|JV3`U>0A8pDq-QNq*m<1Y4?){C`2c;G359 zGn?Z4Sli)<5KpjFq+3wiy?Mz2846#5QqLpaP+I+JhLb(oKs`Axgjp}slQ5T4Tds)9 z8R>r)6f4gbU0d6#3>VkA1H9jTUsQvgkMAK7or_!6W8&Jjd0_qK_sB%&QBOj^o7G>1 z^bjgQxHA7pCWeoq^K#1qdxxJu#3?`}L8$A|M&nNG8rm$_q6|L}Nu|gl% zB%%6Bnya=V>6{%GdD7j2z2dHPaYdNp_kPd;8W@WqcNk_XJc^(4Mp zMpWE6O*i^<7CaD+7jHV;b)Nn!t^H)RACZPo1YMiwXE76SVNJ|Kcmlc}1blmr_Wia| zK#a@={`-aZYyt`-89+3gD%m>cJRzCe`(1EQNk2`W^Es@$GMyE~=_$YY1ldCXk&e>& zYdrIwQ!jR1ad~kgnGh04qlo##>CLnGB=L&dYJDmeKw8lokLkeC6&<3<4Svcq6Vw$4^ci9U#iOK)X4a?_-gl-5K*vYHMzcX5CGu_6Id3 zCIGkJc<@53;2325;t0%>wxVNbN@~7fVItcU5D+*TysQQrmbxjd(Q&0HJwKZB zuzhpvy*LTVsyju^(2Z zz=6vOZViDCZwG8L+b0?nf|H zKf!0ClE8v{^w4a^Z62cXZQ-A0GbCWpV(E)ssJbd$#4NAM75V#v?rO8!Hf7=mbp8!66O4p+=kNDRp0JnTp!^y4cxJiE)C)`B0#K54 zL26A$2o-?ZF2=qn2Ao1RX9<_1{aTgW^!ADW*=lgY({w+#^*ZP;M)Fi9p?h9^1mwE2 z-COncZ`hiVJcQ($l8=&wq;>!U@bIGS9mJJbJ`z6aLUBn?{31r~duGg@{rx5{=%of3 zkn(DaddnpAayR0q-b}KbzZSSw!BFs!orP84#2nBEghEA(5vK(V`2^f%Q`eIF1p;K= z(MrlVJ*hZ?aBF>578#%M9$%!*wTSh22DZR-=jpo5*TGo%wvp~@4+gKBuL4(-oY0zk zSRh`#z&%;If8p^AI~)=9k%}=;u6x&KS_qnwr3UhH%S#U1EoRgM#;ea&!52Zs1UB0Q zD=NjZDpWmJDFYd(?KIg9xh~HaQe}WGZr%g54@FCI?N8i~@n0qPosp)AIG+oFk0$+( z_9vm2T-$+Ap3l%1kk*htE0?UK8b@|rA_iAus58LW{)9uA6qbKWR(rmYNQ(?*(vt?j zW4htxU6+O(^(#!S3`K|vU8(`FI9HS{dYBI`N?*yrx~z)N0OeX7>*c4jCvSC?GK+@% zYiy8y((kxS#E@_3;oOsH0<7W3^Q|{twrYpv2yEml;Zp_ucVvS*Ti27 z@)z>z>-U>~k1q?}L@#~8syiBCzDyMYL^lle$YAzpA1qyu0CjJ?!aTS2f#mk+fslhA zL|fS|r+0S)DWj6J5q8c>)C_wYW+zPqROWzgbNQQQQW%roLx6 ztqJPRqhI#ezy>m_zT1`hWK;El2yPLa_cw|A(^7bsgn>gho`ft z*e8k34BE?q7r?9bS#6<{!hPW|dA& zxkegcC|ic@;^eaUvjP&CBG#E_kl+z`YvqpGjNfD!BRTRJV0!cU{04Nkg4;sZrRNrp z8}L)95z^oid=BnR?AumB@)2T({9^=%5oKzAI7eEBOLlTG1$RJtsh6+~Tg&6z^EVZ9 z4P|QLle_)Zm5kZHR%Hw&NZkaisL4twLqF|B^N^aqud1GlkXn{8Y#?>3iG{pQZpVh1 zrC}3to3IPyj|RkkDtiMeU6_~BJe^lX25xqBb!*<^!mpz?KQyB%Q8Tp@Y3U7ckv7N~}uh|zcj zK5od#nJwf#^Gv&%8pYHZBz`-Trc5=H&qG0)UWDYS^F@)@cL!wdZ+z^rmfAlb`VbJN z?|t={Zj4kW8ax(kDl$K%BGkxqBY((2`i3I^S)hgOMG-2;9(OTTi|?+OQd-jSs|i{R zy97vvtn2vm7JeXG+23*cR%z>}x+=^%r)S;0sS({xdr_FGFGWg;bwGxL)aB+7sRzt= zTYvh;;dAyd)xe&VzW!hPUh(V(qRuDWDbgf4OwBqIrS82MH&-$TE()J?r%3oQ56Ijh zbrHx~yiUfpb(#z5gm}m2ZhauBvzZxaY-RoFN&JT!@e|K6b?nwipY+VdKfGuKmGyTll6Bv8*rYKdcymGsEz|Vmgy{Nauu!i z%E`nB`;$NxbtN_SuLpHfj{Cv@Vkd0YyYe^?(y8fPLadb3fA;jioT|`=NLap|R)~3V zm2Zz*>R|F%=wz)5D>fc2x2_8vn@_D!(`29h&JlTjTttmc@X964Q5LDJ3`usWgL14r zPVam^Pzdix;SbpzI|K#utv)~YG4+#EL1S0VUf0GgxPH|{ZO-mTYFauzOlC|g9FX)KcEw!ypFHLSeFV;e%)OP%Z6N z+QdJ7N!?f1*qMGuO@SYI$B6{6g%*UNncHR*=Qgnt3#n&h%wKsl_%ZQ5u{!LnP=0p` zXQB|}+Mf>b9w%Wzb{1Fkuv(`R4UO2{rN*UR+Iq`jJodcC#UXz%oOT*I=H$?XEuz?J z*&9D4tl;0Tz6rHW$>yn#)#OUQKFr4Ui$B{o{;8?`=C#@R8FAyUYD-3}%+td*C@8W| z)fZh<4ZP)~qr4Zg$7a+AzFMH;c6F-dzwW!(d;R%RnEb;waM9ad?bk&A)3MK@x`j&h zQ1^VT0w+UOxP)_pORtd-rRz^p>-Fnr=_CC{Err;MYV2|B0q;i10?;Bz7z4FAwots% zoMG!T7?JV*_s{_bhser(7$=iFrbyNstw};L$RHjt1Yh7zVXY!R z+M3MTUEC_~_cPiH?1a&la~%jT5HEV25=qpml4me!|+Nu(Ux`Mw*AEUV;7&kX1x8enHZ2{Wn^;L5I1fqD+`wSda|wbwSV>!*b4V5 z`IOq!C2T(-Hkfxt-+$|<@Hiz{Tr6SHR`cch;=z?x4>CJgl8SZTds}o&GrK2aRV8Cd zp(MlJ6m({4>u15Rk1K{?7$t(EBJziBo_a0&)nH0CCNM5!c9^La$JYmawIHLqG0@^0 z*A0H8wJ%bAQ|w+o7(UwR%%k~t-51IB!)y-xn;llv5%0_RQkzcP-z^+>NU89_F0xO0 z=yfgD?7+=}+e%Z|UO-gMBe!#@14=J>x^!ohKa;cW4KG%>XSYk9`G+^|w-MWs3Eghf z1K26A@OCE*BY~NLE~+Ni-Bk5BZ4k02Dc{7n+M6vm-RU`$UoI4#p6;d%qbV$v&9?=w dGZ5K>GZGC~H!nYnNL_qbK~D8a(PQ(V{{#Fs)inSB literal 0 HcmV?d00001 diff --git a/src/components/Pending/Loading.tsx b/src/components/Pending/Loading.tsx new file mode 100644 index 00000000..e29330a5 --- /dev/null +++ b/src/components/Pending/Loading.tsx @@ -0,0 +1,55 @@ +import React, { useEffect, useState } from 'react'; + +import ImageOne from '../../assets/loading/1.png'; +import ImageThree from '../../assets/loading/3.png'; +import ImageTwo from '../../assets/loading/2.png'; +import cn from '../../lib/cn'; + +interface PendingProps { + height: number | string; // 높이를 px 또는 vh 단위로 받음 +} + +const Pending: React.FC = ({ height }) => { + const [imageUrl, setImageUrl] = useState(null); + + // 이미지 목록을 배열로 정의 + const images = [ImageOne, ImageTwo, ImageThree]; + + // 컴포넌트 마운트 시 랜덤으로 이미지 선택 + useEffect(() => { + const randomIndex = Math.floor(Math.random() * images.length); + setImageUrl(images[randomIndex]); + }, []); + + // 높이 값이 px인지 vh인지 판단하여 스타일 설정 + const heightStyle = typeof height === 'string' ? height : `${height}px`; + + return ( +

+ {/* 이미지가 중앙에 정렬된 컨테이너 */} +
+ {imageUrl && ( // 이미지가 설정되었을 때만 렌더링 + Pending + )} +
+
+ ); +}; + +export default Pending; diff --git a/src/pages/goal.tsx b/src/pages/goal.tsx index 81525147..5c958e5d 100644 --- a/src/pages/goal.tsx +++ b/src/pages/goal.tsx @@ -3,34 +3,50 @@ import { useEffect, useState } from 'react'; import GoormScreen from '../components/Goalpage/GoormScreen.tsx'; import MemberList from '../components/Goalpage/MemberList.tsx'; import NeedLoginComponents from '../components/NeedLoginComponents.tsx'; +import Pending from '../components/Pending/Loading.tsx'; // Pending 컴포넌트 추가 import cn from '../lib/cn.ts'; export default function Goal() { const [isLogin, setIsLogin] = useState(false); + const [isPending, setIsPending] = useState(true); // 로딩 상태 관리 useEffect(() => { + // 로그인 여부 확인 if (localStorage.getItem('accesstoken')) { setIsLogin(true); } + + // 0.3초 동안 로딩 상태 유지 + const timer = setTimeout(() => { + setIsPending(false); + }, 300); // 300ms + + return () => clearTimeout(timer); // 타이머 정리 }, []); return ( -
- {/* 로그인 확인 컴포넌트 */} - {!isLogin ? ( - +
+ {isPending ? ( + // 로딩 중일 때 Pending 컴포넌트 표시 ) : ( - <> -
- - -
- +
+ {/* 로그인 확인 컴포넌트 */} + {!isLogin ? ( + + ) : ( + <> +
+ + +
+ + )} +
)}
); diff --git a/src/pages/guide.tsx b/src/pages/guide.tsx index 4c90217a..07869185 100644 --- a/src/pages/guide.tsx +++ b/src/pages/guide.tsx @@ -1,53 +1,72 @@ +import { useEffect, useState } from 'react'; + import GuideCard from '../components/GuideCard'; import GuideFour from '../assets/guide/guide-4.png'; import GuideOne from '../assets/guide/guide-1.png'; import GuideThree from '../assets/guide/guide-3.png'; import GuideTwo from '../assets/guide/guide-2.png'; +import Pending from '../components/Pending/Loading.tsx'; // Pending 컴포넌트 추가 import cn from '../lib/cn'; export default function Guide() { + const [isPending, setIsPending] = useState(true); + + useEffect(() => { + const timer = setTimeout(() => { + setIsPending(false); + }, 300); // 0.3초 동안 로딩 상태 유지 + + return () => clearTimeout(timer); + }, []); + return ( -
+ {isPending ? ( + // Pending 컴포넌트를 100vh 높이로 표시 + ) : ( +
+
+

+ + 구름다리 어떻게
이용하나요? +
+ + 구름다리 어떻게 이용하나요? + +

+
+
+ 함께'} + /> + 인증'} + /> + 루틴 성취 확인'} + /> + 한눈에 확인'} + /> +
+
)} - > -
-

- - 구름다리 어떻게
이용하나요? -
- - 구름다리 어떻게 이용하나요? - -

-
-
- 함께'} - /> - 인증'} - /> - 루틴 성취 확인'} - /> - 한눈에 확인'} - /> -
); } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 78d7534c..a45878c4 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,11 +1,30 @@ +import { useEffect, useState } from 'react'; + import AdditionalIntroSection from '../components/Mainpage/AdditionalIntroSection.tsx'; import ImageIntroSection from '../components/Mainpage/ImageIntroSection.tsx'; +import Pending from '../components/Pending/Loading.tsx'; export default function Index() { + const [isPending, setIsPending] = useState(true); + + useEffect(() => { + const timer = setTimeout(() => { + setIsPending(false); + }, 300); + + return () => clearTimeout(timer); + }, []); + return (
- - + {isPending ? ( + + ) : ( + <> + + + + )}
); } diff --git a/src/pages/login.tsx b/src/pages/login.tsx index e650344e..1352d1cc 100644 --- a/src/pages/login.tsx +++ b/src/pages/login.tsx @@ -1,4 +1,5 @@ import { API } from '../lib/api'; +import Pending from '../components/Pending/Loading.tsx'; // Pending 컴포넌트 추가 import cn from '../lib/cn.ts'; import { useState } from 'react'; @@ -6,8 +7,10 @@ export default function Login() { // 입력 필드 상태 관리 const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); + const [isPending, setIsPending] = useState(false); // 로딩 상태 관리 const handleLogin = async () => { + setIsPending(true); // 로그인 요청 시 로딩 상태로 전환 try { // 로그인 요청 await API.User.login(username, password); @@ -16,71 +19,89 @@ export default function Login() { } catch (error) { console.error('로그인 실패:', error); alert('로그인에 실패했습니다.'); + } finally { + setIsPending(false); // 요청 완료 후 로딩 상태 해제 } }; return ( -
-
- {/* 로그인 텍스트 영역 */} -
-

로그인

-
- - {/* 아이디 및 비밀번호 입력 필드 영역 */} -
- setUsername(e.target.value)} - /> - + {isPending ? ( + // 로딩 중일 때 Pending 컴포넌트 표시 + ) : ( +
+
setPassword(e.target.value)} - /> -
- - {/* 로그인 및 회원가입 버튼 영역 */} -
- - + {/* 로그인 텍스트 영역 */} +
+

로그인

+
+ + {/* 아이디 및 비밀번호 입력 필드 영역 */} +
+ setUsername(e.target.value)} + /> + setPassword(e.target.value)} + /> +
+ + {/* 로그인 및 회원가입 버튼 영역 */} +
+ + +
+
-
+ )}
); } diff --git a/src/pages/mypage.tsx b/src/pages/mypage.tsx index b4dbdb08..4a2a40d3 100644 --- a/src/pages/mypage.tsx +++ b/src/pages/mypage.tsx @@ -2,16 +2,25 @@ import { useEffect, useState } from 'react'; import Goals from '../components/Mypage/Goals'; import NeedLoginComponents from '../components/NeedLoginComponents.tsx'; +import Pending from '../components/Pending/Loading.tsx'; // Pending 컴포넌트 추가 import Profile from '../components/Mypage/Profile'; import cn from '../lib/cn.ts'; export default function MyPage() { const [isLogin, setIsLogin] = useState(false); + const [isPending, setIsPending] = useState(true); // 로딩 상태 관리 useEffect(() => { if (localStorage.getItem('accesstoken')) { setIsLogin(true); } + + // 0.3초 동안 로딩 상태 유지 + const timer = setTimeout(() => { + setIsPending(false); + }, 300); // 300ms 로딩 + + return () => clearTimeout(timer); // 타이머 정리 }, []); const handleLogout = () => { @@ -26,30 +35,36 @@ export default function MyPage() { }; return ( -
- {/* 로그인 확인 컴포넌트 */} - {!isLogin ? ( - +
+ {isPending ? ( + // 로딩 중일 때 Pending 컴포넌트 표시 ) : ( - <> - - - {/* 로그아웃 버튼 */} - - +
+ {/* 로그인 확인 컴포넌트 */} + {!isLogin ? ( + + ) : ( + <> + + + {/* 로그아웃 버튼 */} + + + )} +
)}
); diff --git a/src/pages/register.tsx b/src/pages/register.tsx index c7e5a377..e33847f3 100644 --- a/src/pages/register.tsx +++ b/src/pages/register.tsx @@ -1,6 +1,7 @@ import React, { useState } from 'react'; import { API } from '../lib/api/index.ts'; +import Pending from '../components/Pending/Loading.tsx'; // Pending 컴포넌트 추가 import cn from '../lib/cn.ts'; import { useNavigate } from 'react-router-dom'; @@ -12,6 +13,7 @@ export default function Register() { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); + const [isPending, setIsPending] = useState(false); // 로딩 상태 관리 const handleRegister = async () => { if (password !== confirmPassword) { @@ -19,6 +21,7 @@ export default function Register() { return; } + setIsPending(true); // 회원가입 요청 시 로딩 상태로 전환 try { // 회원가입 요청 await API.User.register(nickname, username, password); @@ -27,91 +30,109 @@ export default function Register() { } catch (error) { console.error('회원가입 실패:', error); alert('회원가입에 실패했습니다.'); + } finally { + setIsPending(false); // 요청 완료 후 로딩 상태 해제 } }; return ( -
-
- {/* 회원가입 텍스트 영역 */} -
-

회원가입

-
- - {/* 입력 필드 영역 */} -
- setNickname(e.target.value)} - /> - + {isPending ? ( + // 로딩 중일 때 Pending 컴포넌트 표시 + ) : ( +
+
setUsername(e.target.value)} - /> - setPassword(e.target.value)} - /> - setConfirmPassword(e.target.value)} - /> -
- - {/* 확인 및 취소 버튼 영역 */} -
- - + {/* 회원가입 텍스트 영역 */} +
+

회원가입

+
+ + {/* 입력 필드 영역 */} +
+ setNickname(e.target.value)} + /> + setUsername(e.target.value)} + /> + setPassword(e.target.value)} + /> + + setConfirmPassword(e.target.value) + } + /> +
+ + {/* 확인 및 취소 버튼 영역 */} +
+ + +
+
-
+ )}
); } From 76547fe2432aacd57643f073de3167a25fed3ba2 Mon Sep 17 00:00:00 2001 From: Yunseok Date: Sun, 29 Sep 2024 00:33:11 +0900 Subject: [PATCH 15/17] =?UTF-8?q?[STYLE]=20-=20=EB=AA=A8=EB=B0=94=EC=9D=BC?= =?UTF-8?q?=20=ED=96=84=EB=B2=84=EA=B1=B0=20=EB=A9=94=EB=89=B4=20div?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95=20+=20=ED=81=AC=EA=B8=B0=20xl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Header/NavLink.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Header/NavLink.tsx b/src/components/Header/NavLink.tsx index 433ef60f..db95ec38 100644 --- a/src/components/Header/NavLink.tsx +++ b/src/components/Header/NavLink.tsx @@ -17,14 +17,14 @@ export default function NavLink({ href, label }: NavLinkProps) { }; return ( - +
); } From ab32e11c53f0141b18a12beb3c3657c12b20d82f Mon Sep 17 00:00:00 2001 From: Yunseok Date: Sun, 29 Sep 2024 00:33:56 +0900 Subject: [PATCH 16/17] =?UTF-8?q?[FIX]=20-=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Header/NavLink.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Header/NavLink.tsx b/src/components/Header/NavLink.tsx index db95ec38..5c321208 100644 --- a/src/components/Header/NavLink.tsx +++ b/src/components/Header/NavLink.tsx @@ -20,7 +20,7 @@ export default function NavLink({ href, label }: NavLinkProps) {
From 6a015e7dfad9d20c7d72185d3dab81846aebf11d Mon Sep 17 00:00:00 2001 From: Yunseok Date: Sun, 29 Sep 2024 00:57:36 +0900 Subject: [PATCH 17/17] =?UTF-8?q?[STYLE]=20-=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=20=EC=A0=84=EB=B6=80=20=EB=B3=B4=EC=97=AC=EC=A3=BC=EA=B3=A0=20?= =?UTF-8?q?=EC=97=AC=EB=B0=B1=20=ED=9A=8C=EC=83=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Goalpage/MemberList/ShowImageModal.tsx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/components/Goalpage/MemberList/ShowImageModal.tsx b/src/components/Goalpage/MemberList/ShowImageModal.tsx index 04481935..5be0c539 100644 --- a/src/components/Goalpage/MemberList/ShowImageModal.tsx +++ b/src/components/Goalpage/MemberList/ShowImageModal.tsx @@ -81,18 +81,16 @@ export default function ShowImageModal({
{displayImages.map((image, index) => ( +
{image.alt} +
))}