From dfaa803d41efe655390ccf8e64cd631c59b09dfa Mon Sep 17 00:00:00 2001 From: lalaurel Date: Mon, 30 Dec 2024 00:23:23 +0900 Subject: [PATCH 01/27] refctor: accountCancel currentId --- src/pages/Account/AccountCancel/index.tsx | 231 +++++++++++----------- 1 file changed, 113 insertions(+), 118 deletions(-) diff --git a/src/pages/Account/AccountCancel/index.tsx b/src/pages/Account/AccountCancel/index.tsx index 1c30b279..9f9c7456 100644 --- a/src/pages/Account/AccountCancel/index.tsx +++ b/src/pages/Account/AccountCancel/index.tsx @@ -2,11 +2,10 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import theme from '@styles/theme'; - +import { getCurrentUserId } from '@utils/getCurrentUserId'; import { patchUserWithdrawApi } from '@apis/user'; import back from '@assets/arrow/left.svg'; - import BottomButton from '@components/BottomButton/index'; import { OODDFrame } from '@components/Frame/Frame'; import Modal from '@components/Modal/index'; @@ -14,123 +13,119 @@ import { StyledText } from '@components/Text/StyledText'; import TopBar from '@components/TopBar/index'; import { - CancelContainer, - SubTitle, - Text, - InfoBox, - InfoItem, - CheckboxWrapper, - CheckboxInput, - Label, - StyledCheckboxText, - StyledDiv, -} from './styles'; // 상대 경로 index 명시 + CancelContainer, + SubTitle, + Text, + InfoBox, + InfoItem, + CheckboxWrapper, + CheckboxInput, + Label, + StyledCheckboxText, + StyledDiv, +} from './styles'; const AccountCancel: React.FC = () => { - const [isChecked, setIsChecked] = useState(false); - const [modalContent, setModalContent] = useState(null); - const [isModalVisible, setIsModalVisible] = useState(false); - const navigate = useNavigate(); - - const handleCheckboxChange = () => { - setIsChecked(!isChecked); - }; - - const handleModalClose = () => { - setIsModalVisible(false); - setModalContent(null); - }; - - const handleDeleteAccount = async () => { - try { - if (!isChecked) { - setModalContent('탈퇴 안내사항에 동의해야 합니다.'); - setIsModalVisible(true); - return; - } - - const storedUserId = Number(localStorage.getItem('my_id')); - const token = localStorage.getItem('new_jwt_token'); - - if (!storedUserId || !token) { - setModalContent('사용자 정보를 찾을 수 없습니다.'); - setIsModalVisible(true); - return; - } - - // API 요청 - const response = await patchUserWithdrawApi(storedUserId); - - if (response.isSuccess) { - setModalContent('계정이 성공적으로 삭제되었습니다.'); - setIsModalVisible(true); - - // 계정 삭제 시 localStorage에서 사용자 정보 제거 - localStorage.clear(); - - setTimeout(() => { - navigate('/login'); - }, 2000); - } else { - setModalContent(response.code || '알 수 없는 오류가 발생했습니다.'); - setIsModalVisible(true); - } - } catch (error) { - console.error('계정 삭제하는데 오류남:', error); - setModalContent('계정을 삭제하는 동안 오류가 발생했습니다. 다시 시도해 주세요.'); - setIsModalVisible(true); - } - }; - - return ( - - - navigate(-1)} /> - - - - OOTD 탈퇴 전 확인하세요! - - - - - {`탈퇴하시면 이용 중인 서비스가 폐쇄되며,\n모든 데이터는 복구할 수 없습니다.`} - - - - - - 지금까지 OODD를 이용해주셔서 감사합니다! - - - - - - - - - - - {isModalVisible && ( - - )} - - ); + const [isChecked, setIsChecked] = useState(false); + const [modalContent, setModalContent] = useState(null); + const [isModalVisible, setIsModalVisible] = useState(false); + const navigate = useNavigate(); + + const handleCheckboxChange = () => { + setIsChecked(!isChecked); + }; + + const handleModalClose = () => { + setIsModalVisible(false); + setModalContent(null); + }; + + const handleDeleteAccount = async () => { + try { + if (!isChecked) { + setModalContent('탈퇴 안내사항에 동의해야 합니다.'); + setIsModalVisible(true); + return; + } + + const currentUserId = getCurrentUserId(); + const token = localStorage.getItem('new_jwt_token'); + + if (!currentUserId || !token) { + setModalContent('사용자 정보를 찾을 수 없습니다.'); + setIsModalVisible(true); + return; + } + + const response = await patchUserWithdrawApi(currentUserId); + + if (response.isSuccess) { + setModalContent('계정이 성공적으로 삭제되었습니다.'); + setIsModalVisible(true); + localStorage.clear(); + + setTimeout(() => { + navigate('/login'); + }, 2000); + } else { + setModalContent(response.code || '알 수 없는 오류가 발생했습니다.'); + setIsModalVisible(true); + } + } catch (error) { + console.error('계정 삭제하는데 오류남:', error); + setModalContent('계정을 삭제하는 동안 오류가 발생했습니다. 다시 시도해 주세요.'); + setIsModalVisible(true); + } + }; + + return ( + + + navigate(-1)} /> + + + OOTD 탈퇴 전 확인하세요! + + + + + {`탈퇴하시면 이용 중인 서비스가 폐쇄되며,\n모든 데이터는 복구할 수 없습니다.`} + + + + + + 지금까지 OODD를 이용해주셔서 감사합니다! + + + + + + + + + + + {isModalVisible && ( + + )} + + ); }; -export default AccountCancel; +export default AccountCancel; \ No newline at end of file From 2b0feb65976f87271a3b36eebf18f156855030ae Mon Sep 17 00:00:00 2001 From: lalaurel Date: Mon, 30 Dec 2024 00:23:42 +0900 Subject: [PATCH 02/27] refactor: accountSetting currentId --- src/pages/Account/AccountSetting/index.tsx | 219 +++++++++++---------- 1 file changed, 111 insertions(+), 108 deletions(-) diff --git a/src/pages/Account/AccountSetting/index.tsx b/src/pages/Account/AccountSetting/index.tsx index 5abb4b9f..a23ccb79 100644 --- a/src/pages/Account/AccountSetting/index.tsx +++ b/src/pages/Account/AccountSetting/index.tsx @@ -2,7 +2,7 @@ import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import theme from '@styles/theme'; - +import { getCurrentUserId } from '@utils/getCurrentUserId'; import { getUserInfoApi } from '@apis/user'; import back from '@assets/arrow/left.svg'; @@ -16,115 +16,118 @@ import Loading from '@components/Loading/index'; import { StyledText } from '@components/Text/StyledText'; import TopBar from '@components/TopBar/index'; -import type { UserInfoData } from '@apis/user/dto'; // type 명시 +import type { UserInfoData } from '@apis/user/dto'; -import { ProfileEditContainer, ProfilePic, ProfilePicWrapper, Label, Row, List, ListItem } from './styles'; +import { + ProfileEditContainer, + ProfilePic, + ProfilePicWrapper, + Label, + Row, + List, + ListItem +} from './styles'; const AccountSetting: React.FC = () => { - const navigate = useNavigate(); - const [isLogoutModalOpen, setIsLogoutModalOpen] = useState(false); - const [userProfile, setUserProfile] = useState(null); - const [isLoading, setIsLoading] = useState(true); - - // 사용자 정보 가져오기 - useEffect(() => { - const getUserInfo = async () => { - try { - const storedUserId = Number(localStorage.getItem('my_id')); - if (!storedUserId) { - console.error('User is not logged in'); - return; - } - - const userId = Number(storedUserId); - const response = await getUserInfoApi(userId); - setUserProfile(response.data); - } catch (error) { - console.error('Error fetching user info:', error); - } finally { - setIsLoading(false); - } - }; - - getUserInfo(); - }, []); - - const handleConfirmLogout = () => { - // localStorage 비우기 - localStorage.clear(); - console.log('Logout confirmed'); - setIsLogoutModalOpen(false); - - navigate('/login'); - }; - - const handleLogoutClick = () => { - setIsLogoutModalOpen(true); - }; - - const handleCloseModal = () => { - setIsLogoutModalOpen(false); - }; - - const handleDeleteAccountClick = () => { - // 회원 탈퇴 로직 추가 - navigate('/account/cancel'); - }; - - if (isLoading) { - return ; - } - - return ( - - - navigate(-1)} /> - - - - 프로필 사진 - - - - - - - - - - - - 로그아웃 아이콘 - - Logout - - - - 회원 탈퇴 아이콘 - - 회원탈퇴 - - - - {isLogoutModalOpen && ( - - )} - - - ); + const navigate = useNavigate(); + const [isLogoutModalOpen, setIsLogoutModalOpen] = useState(false); + const [userProfile, setUserProfile] = useState(null); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + const getUserInfo = async () => { + try { + const currentUserId = getCurrentUserId(); + if (!currentUserId) { + console.error('User is not logged in'); + return; + } + + const response = await getUserInfoApi(currentUserId); + setUserProfile(response.data); + } catch (error) { + console.error('Error fetching user info:', error); + } finally { + setIsLoading(false); + } + }; + + getUserInfo(); + }, []); + + const handleConfirmLogout = () => { + localStorage.clear(); + console.log('Logout confirmed'); + setIsLogoutModalOpen(false); + navigate('/login'); + }; + + const handleLogoutClick = () => { + setIsLogoutModalOpen(true); + }; + + const handleCloseModal = () => { + setIsLogoutModalOpen(false); + }; + + const handleDeleteAccountClick = () => { + navigate('/account/cancel'); + }; + + if (isLoading) { + return ; + } + + return ( + + + navigate(-1)} /> + + + 프로필 사진 + + + + + + + + + + + + 로그아웃 아이콘 + + Logout + + + + 회원 탈퇴 아이콘 + + 회원탈퇴 + + + + + {isLogoutModalOpen && ( + + )} + + + ); }; -export default AccountSetting; +export default AccountSetting; \ No newline at end of file From 694731b44ea82b93a80505838ccf656d2e93fad8 Mon Sep 17 00:00:00 2001 From: lalaurel Date: Mon, 30 Dec 2024 00:23:53 +0900 Subject: [PATCH 03/27] refactor: profile currentId --- src/pages/Profile/index.tsx | 313 ++++++++++++++++++------------------ 1 file changed, 158 insertions(+), 155 deletions(-) diff --git a/src/pages/Profile/index.tsx b/src/pages/Profile/index.tsx index 76151556..ca04aae1 100644 --- a/src/pages/Profile/index.tsx +++ b/src/pages/Profile/index.tsx @@ -1,8 +1,10 @@ import { useState, useEffect } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; +import { useRecoilValue } from 'recoil'; import theme from '@styles/theme'; - +import { OtherUserAtom } from '@recoil/util/OtherUser'; +import { getCurrentUserId } from '@utils/getCurrentUserId'; import { createMatchingApi } from '@apis/matching'; import { getUserPostListApi } from '@apis/post'; import { getUserInfoApi } from '@apis/user'; @@ -23,165 +25,166 @@ import { StyledText } from '@components/Text/StyledText'; import TopBar from '@components/TopBar'; import UserProfile from '@components/UserProfile'; -import type { UserPostSummary } from '@apis/post/dto'; // type 명시 -import type { UserInfoData } from '@apis/user/dto'; // type 명시 +import type { UserPostSummary } from '@apis/post/dto'; +import type { UserInfoData } from '@apis/user/dto'; -import ButtonSecondary from './ButtonSecondary/index'; // 상대 경로 index 명시 -import NavbarProfile from './NavbarProfile/index'; // 상대 경로 index 명시 +import ButtonSecondary from './ButtonSecondary/index'; +import NavbarProfile from './NavbarProfile/index'; import { - ProfileContainer, - Header, - StatsContainer, - Stat, - StatNumber, - StatLabel, - PostsContainer, - AddButton, - NoPostWrapper, - Button, + ProfileContainer, + Header, + StatsContainer, + Stat, + StatNumber, + StatLabel, + PostsContainer, + AddButton, + NoPostWrapper, + Button, } from './styles'; const Profile: React.FC = () => { - const { userId } = useParams<{ userId: string }>(); - const profileUserId = Number(userId); - const loggedInUserId = Number(localStorage.getItem('current_user_id')); - - const [isLoading, setIsLoading] = useState(true); - const [posts, setPosts] = useState([]); - const [totalPosts, setTotalPosts] = useState(0); - const [userInfo, setUserInfo] = useState(null); - const [isBottomSheetOpen, setIsBottomSheetOpen] = useState(false); - const [isOptionsBottomSheetOpen, setIsOptionsBottomSheetOpen] = useState(false); // 추가 - const [isModalOpen, setIsModalOpen] = useState(false); - const [modalContent, setModalContent] = useState(''); - const navigate = useNavigate(); - - const isMyPage = loggedInUserId === profileUserId; - - useEffect(() => { - const fetchData = async () => { - try { - const response = await getUserInfoApi(profileUserId); - const postResponse = await getUserPostListApi(1, 10, profileUserId); - setUserInfo(response.data); - setPosts(postResponse.data.post); - setTotalPosts(postResponse.data.totalPostsCount); - } catch (error) { - console.error('데이터 가져오기 실패:', error); - } finally { - setIsLoading(false); - } - }; - fetchData(); - }, [profileUserId]); - - const createMatching = async (message: string) => { - const matchingRequestData = { - requesterId: loggedInUserId, - targetId: profileUserId, - message: message, - }; - - try { - await createMatchingApi(matchingRequestData); - handleModalOpen(`${userInfo?.nickname}님에게 대표 OOTD와 \n한 줄 메세지를 보냈어요!`); - } catch (error) { - console.error('매칭 신청 오류:', error); - handleModalOpen('매칭 신청에 실패했습니다.'); - } - }; - - const handleModalOpen = (message: string) => { - setIsBottomSheetOpen(false); - setModalContent(message); - setIsModalOpen(true); - }; - - if (isLoading) return ; - - return ( - - - {isMyPage && ( - navigate('/post/upload/photo/select')}> - Add - - )} - - {isMyPage ? ( - - ) : ( - navigate(-1)} - onClickRightButton={() => setIsOptionsBottomSheetOpen(true)} - /> - )} - -
- -
- - {isMyPage ? : } - - - - OOTD - {totalPosts || 0} - - {isMyPage && ( - - 코멘트 - {posts.reduce((sum, post) => sum + (post.postCommentsCount || 0), 0)} - - )} - - 좋아요 - {posts.reduce((sum, post) => sum + (post.postLikesCount || 0), 0)} - - - - - {posts.length > 0 ? ( - posts.map((post) => ) - ) : ( - - - 게시물이 없어요. - - - )} - - - {isMyPage && } - - setIsBottomSheetOpen(false)} - /> - - setIsOptionsBottomSheetOpen(false)} - /> - - {isModalOpen && setIsModalOpen(false)} />} -
-
- ); + const { userId } = useParams<{ userId: string }>(); + const profileUserId = Number(userId); + const loggedInUserId = getCurrentUserId(); + const otherUser = useRecoilValue(OtherUserAtom); + + const [isLoading, setIsLoading] = useState(true); + const [posts, setPosts] = useState([]); + const [totalPosts, setTotalPosts] = useState(0); + const [userInfo, setUserInfo] = useState(null); + const [isBottomSheetOpen, setIsBottomSheetOpen] = useState(false); + const [isOptionsBottomSheetOpen, setIsOptionsBottomSheetOpen] = useState(false); + const [isModalOpen, setIsModalOpen] = useState(false); + const [modalContent, setModalContent] = useState(''); + const navigate = useNavigate(); + + const isMyPage = loggedInUserId === profileUserId; + + useEffect(() => { + const fetchData = async () => { + try { + const response = await getUserInfoApi(profileUserId); + const postResponse = await getUserPostListApi(1, 10, profileUserId); + setUserInfo(response.data); + setPosts(postResponse.data.post); + setTotalPosts(postResponse.data.totalPostsCount); + } catch (error) { + console.error('데이터 가져오기 실패:', error); + } finally { + setIsLoading(false); + } + }; + fetchData(); + }, [profileUserId]); + + const createMatching = async (message: string) => { + const matchingRequestData = { + requesterId: loggedInUserId, + targetId: otherUser?.id || profileUserId, + message: message, + }; + + try { + await createMatchingApi(matchingRequestData); + handleModalOpen(`${userInfo?.nickname}님에게 대표 OOTD와 \n한 줄 메세지를 보냈어요!`); + } catch (error) { + console.error('매칭 신청 오류:', error); + handleModalOpen('매칭 신청에 실패했습니다.'); + } + }; + + const handleModalOpen = (message: string) => { + setIsBottomSheetOpen(false); + setModalContent(message); + setIsModalOpen(true); + }; + + if (isLoading) return ; + + return ( + + + {isMyPage && ( + navigate('/post/upload/photo/select')}> + Add + + )} + + {isMyPage ? ( + + ) : ( + navigate(-1)} + onClickRightButton={() => setIsOptionsBottomSheetOpen(true)} + /> + )} + +
+ +
+ + {isMyPage ? : } + + + + OOTD + {totalPosts || 0} + + {isMyPage && ( + + 코멘트 + {posts.reduce((sum, post) => sum + (post.postCommentsCount || 0), 0)} + + )} + + 좋아요 + {posts.reduce((sum, post) => sum + (post.postLikesCount || 0), 0)} + + + + + {posts.length > 0 ? ( + posts.map((post) => ) + ) : ( + + + 게시물이 없어요. + + + )} + + + {isMyPage && } + + setIsBottomSheetOpen(false)} + /> + + setIsOptionsBottomSheetOpen(false)} + /> + + {isModalOpen && setIsModalOpen(false)} />} +
+
+ ); }; -export default Profile; +export default Profile; \ No newline at end of file From cc9ed2382413451263a8ec6e2a6e5fdadcf53a92 Mon Sep 17 00:00:00 2001 From: lalaurel Date: Mon, 30 Dec 2024 00:24:07 +0900 Subject: [PATCH 04/27] =?UTF-8?q?refactor:=20=EA=B8=80=EC=94=A8=20?= =?UTF-8?q?=EC=83=89=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Profile/styles.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Profile/styles.tsx b/src/pages/Profile/styles.tsx index 28a470cf..23d4b7cc 100644 --- a/src/pages/Profile/styles.tsx +++ b/src/pages/Profile/styles.tsx @@ -88,7 +88,7 @@ export const Button = styled.button` margin: 1.25rem auto; height: 3.1rem; text-align: center; - color: ${({ theme }) => theme.colors.contrast}; + color: ${({ theme }) => theme.colors.text.contrast}; cursor: pointer; box-sizing: border-box; border-radius: 10px; From 6e0027e71d113ccafa17da8b03a9128404231d5e Mon Sep 17 00:00:00 2001 From: lalaurel Date: Mon, 30 Dec 2024 00:24:20 +0900 Subject: [PATCH 05/27] refactor: profileEdit currentId --- src/pages/Profile/ProfileEdit/index.tsx | 403 ++++++++++++------------ 1 file changed, 199 insertions(+), 204 deletions(-) diff --git a/src/pages/Profile/ProfileEdit/index.tsx b/src/pages/Profile/ProfileEdit/index.tsx index 9cf565b6..60668195 100644 --- a/src/pages/Profile/ProfileEdit/index.tsx +++ b/src/pages/Profile/ProfileEdit/index.tsx @@ -1,10 +1,9 @@ import { useRef, useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; - import { ref, uploadBytes, getDownloadURL } from 'firebase/storage'; import theme from '@styles/theme'; - +import { getCurrentUserId } from '@utils/getCurrentUserId'; import { getUserInfoApi, patchUserInfoApi } from '@apis/user'; import { storage } from '@config/firebaseConfig'; @@ -19,215 +18,211 @@ import Modal from '@components/Modal/index'; import { StyledText } from '@components/Text/StyledText'; import TopBar from '@components/TopBar/index'; -import type { UserInfoData, PatchUserInfoRequest } from '@apis/user/dto'; // type 명시 +import type { UserInfoData, PatchUserInfoRequest } from '@apis/user/dto'; import { - ProfileEditContainer, - ProfilePic, - ProfilePicWrapper, - Input, - Button, - Row, - FileInput, - CameraIcon, - UserInfo, - Username, - EmailInput, + ProfileEditContainer, + ProfilePic, + ProfilePicWrapper, + Input, + Button, + Row, + FileInput, + CameraIcon, + UserInfo, + Username, + EmailInput, } from './styles'; type ExtendedUserInfoData = UserInfoData & { - birthDate?: string; // 확장된 속성 + birthDate?: string; }; const ProfileEdit: React.FC = () => { - const fileInputRef = useRef(null); - const [nickname, setNickname] = useState(''); - const [bio, setBio] = useState(''); - const [profilePictureUrl, setProfilePictureUrl] = useState(null); - const [phoneNumber, setPhoneNumber] = useState(''); // 전화번호 - const [birthDate, setBirthDate] = useState(''); // 생년월일 - const [name, setName] = useState(''); // 이름 - const [email, setEmail] = useState(''); // 이메일 - const [isLoading, setIsLoading] = useState(true); - const navigate = useNavigate(); - const [modalContent, setModalContent] = useState(null); - const [isModalVisible, setIsModalVisible] = useState(false); - const [uploading, setUploading] = useState(false); // 업로드 상태 관리 - const userId = localStorage.getItem('my_id'); - - // 사용자 정보 불러오기 - useEffect(() => { - const getUserInfo = async () => { - try { - const storedUserId = Number(localStorage.getItem('my_id')); - if (!storedUserId) { - console.error('User ID not found in localStorage'); - return; - } - - const userId = Number(storedUserId); // 문자열을 숫자로 변환 - const response = await getUserInfoApi(userId); // 사용자 정보 조회 API 호출 - const userInfo: ExtendedUserInfoData = response.data; // 확장된 타입 사용 - - // 상태 업데이트 - setNickname(userInfo.nickname); - setBio(userInfo.bio); - setProfilePictureUrl(userInfo.profilePictureUrl || null); - setPhoneNumber(userInfo.phoneNumber || ''); - setBirthDate(userInfo.birthDate || ''); // 확장된 속성 사용 - setName(userInfo.name || ''); - setEmail(userInfo.email || ''); - } catch (error) { - console.error('Error fetching user info:', error); - } finally { - setIsLoading(false); // 로딩 상태 종료 - } - }; - - getUserInfo(); - }, []); - - const handleButtonClick = () => { - fileInputRef.current?.click(); - }; - - const handleFileChange = async (event: React.ChangeEvent) => { - const file = event.target.files?.[0]; - if (file) { - setUploading(true); - try { - const storageRef = ref(storage, `profilePictures/${file.name}`); - await uploadBytes(storageRef, file); // Firebase에 파일 업로드 - const imageUrl = await getDownloadURL(storageRef); // 업로드된 파일의 다운로드 URL 가져오기 - setProfilePictureUrl(imageUrl); - console.log('File uploaded and URL retrieved:', imageUrl); - } catch (error) { - console.error('Error uploading file:', error); - } finally { - setUploading(false); - } - } - }; - - const handleModalClose = () => { - setIsModalVisible(false); - setModalContent(null); - }; - - const handleSave = async () => { - try { - const storedUserId = Number(localStorage.getItem('my_id')); - if (!storedUserId) { - console.error('User ID not found in localStorage'); - return; - } - - const formattedBirthDate = birthDate ? new Date(birthDate).toISOString().split('T')[0] : ''; - - const payload: PatchUserInfoRequest = { - name: name || 'Default Name', - phoneNumber: phoneNumber || '000-0000-0000', - birthDate: formattedBirthDate, - email: email || 'default@example.com', - nickname: nickname || '닉네임 없음', - profilePictureUrl: profilePictureUrl || '', - bio: bio || '', - }; - - const response = await patchUserInfoApi(payload, storedUserId); - - if (response.isSuccess) { - setModalContent('프로필이 성공적으로 수정되었습니다.'); - setIsModalVisible(true); - - // 모달 닫힌 후 마이페이지로 이동 - setTimeout(() => { - handleModalClose(); - navigate(`/profile/${userId}`); - }, 2000); - } else { - setModalContent('프로필 수정에 실패했습니다.'); - setIsModalVisible(true); - } - } catch (error) { - setModalContent('프로필 수정 중 오류가 발생했습니다.'); - setIsModalVisible(true); - console.error('Error updating user info:', error); - } - }; - - if (isLoading || uploading) { - return ; - } - - return ( - - - navigate(-1)} /> - {isModalVisible && ( - - )} - - - 프로필 사진 - - - - - - - {nickname || '알수없음'} - - - - - 이름 - - setName(e.target.value)} /> - - - - 닉네임 - - setNickname(e.target.value)} /> - - - - 소개글 - - setBio(e.target.value)} /> - - - - 전화번호 - - setPhoneNumber(e.target.value)} /> - - - - 생년월일 - - setBirthDate(e.target.value)} /> - - - - 이메일 - - setEmail(e.target.value)} /> - - - - - ); + const fileInputRef = useRef(null); + const [nickname, setNickname] = useState(''); + const [bio, setBio] = useState(''); + const [profilePictureUrl, setProfilePictureUrl] = useState(null); + const [phoneNumber, setPhoneNumber] = useState(''); + const [birthDate, setBirthDate] = useState(''); + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [isLoading, setIsLoading] = useState(true); + const navigate = useNavigate(); + const [modalContent, setModalContent] = useState(null); + const [isModalVisible, setIsModalVisible] = useState(false); + const [uploading, setUploading] = useState(false); + const userId = getCurrentUserId(); + + useEffect(() => { + const getUserInfo = async () => { + try { + const currentUserId = getCurrentUserId(); + if (!currentUserId) { + console.error('User ID not found'); + return; + } + + const response = await getUserInfoApi(currentUserId); + const userInfo: ExtendedUserInfoData = response.data; + + setNickname(userInfo.nickname); + setBio(userInfo.bio); + setProfilePictureUrl(userInfo.profilePictureUrl || null); + setPhoneNumber(userInfo.phoneNumber || ''); + setBirthDate(userInfo.birthDate || ''); + setName(userInfo.name || ''); + setEmail(userInfo.email || ''); + } catch (error) { + console.error('Error fetching user info:', error); + } finally { + setIsLoading(false); + } + }; + + getUserInfo(); + }, []); + + const handleButtonClick = () => { + fileInputRef.current?.click(); + }; + + const handleFileChange = async (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (file) { + setUploading(true); + try { + const storageRef = ref(storage, `profilePictures/${file.name}`); + await uploadBytes(storageRef, file); + const imageUrl = await getDownloadURL(storageRef); + setProfilePictureUrl(imageUrl); + console.log('File uploaded and URL retrieved:', imageUrl); + } catch (error) { + console.error('Error uploading file:', error); + } finally { + setUploading(false); + } + } + }; + + const handleModalClose = () => { + setIsModalVisible(false); + setModalContent(null); + }; + + const handleSave = async () => { + try { + const currentUserId = getCurrentUserId(); + if (!currentUserId) { + console.error('User ID not found'); + return; + } + + const formattedBirthDate = birthDate ? new Date(birthDate).toISOString().split('T')[0] : ''; + + const payload: PatchUserInfoRequest = { + name: name || 'Default Name', + phoneNumber: phoneNumber || '000-0000-0000', + birthDate: formattedBirthDate, + email: email || 'default@example.com', + nickname: nickname || '닉네임 없음', + profilePictureUrl: profilePictureUrl || '', + bio: bio || '', + }; + + const response = await patchUserInfoApi(payload, currentUserId); + + if (response.isSuccess) { + setModalContent('프로필이 성공적으로 수정되었습니다.'); + setIsModalVisible(true); + + setTimeout(() => { + handleModalClose(); + navigate(`/profile/${userId}`); + }, 2000); + } else { + setModalContent('프로필 수정에 실패했습니다.'); + setIsModalVisible(true); + } + } catch (error) { + setModalContent('프로필 수정 중 오류가 발생했습니다.'); + setIsModalVisible(true); + console.error('Error updating user info:', error); + } + }; + + if (isLoading || uploading) { + return ; + } + + return ( + + + navigate(-1)} /> + {isModalVisible && ( + + )} + + + 프로필 사진 + + + + + + + {nickname || '알수없음'} + + + + + 이름 + + setName(e.target.value)} /> + + + + 닉네임 + + setNickname(e.target.value)} /> + + + + 소개글 + + setBio(e.target.value)} /> + + + + 전화번호 + + setPhoneNumber(e.target.value)} /> + + + + 생년월일 + + setBirthDate(e.target.value)} /> + + + + 이메일 + + setEmail(e.target.value)} /> + + + + + ); }; -export default ProfileEdit; +export default ProfileEdit; \ No newline at end of file From c15e7f1c34d44e5f88082d1e1c43932acfa5048b Mon Sep 17 00:00:00 2001 From: xxinzzi <156905845+xxinzzi@users.noreply.github.com> Date: Tue, 31 Dec 2024 17:45:46 +0900 Subject: [PATCH 06/27] =?UTF-8?q?Refactor:=20PostImageSelect=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PostImageSelect/ImageSwiper/index.tsx | 4 ++-- src/pages/Post/PostImageSelect/index.tsx | 20 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/pages/Post/PostImageSelect/ImageSwiper/index.tsx b/src/pages/Post/PostImageSelect/ImageSwiper/index.tsx index 27025f65..ba9a655d 100644 --- a/src/pages/Post/PostImageSelect/ImageSwiper/index.tsx +++ b/src/pages/Post/PostImageSelect/ImageSwiper/index.tsx @@ -17,7 +17,7 @@ const ImageSwiper: React.FC = ({ images, onProcessFile, onRemo const fileInputRef = useRef(null); const [currentSlide, setCurrentSlide] = useState(0); - const handleSelectImage = () => { + const handleImageSelect = () => { if (fileInputRef.current) { fileInputRef.current.click(); } @@ -51,7 +51,7 @@ const ImageSwiper: React.FC = ({ images, onProcessFile, onRemo ))} - + { @@ -55,7 +55,7 @@ const PostImageSelect: React.FC = () => { }; // 파일 선택기에서 사진 업로드 - const handleSelectImage = () => { + const handleImageSelect = () => { if (fileInputRef.current) { fileInputRef.current.click(); } @@ -74,14 +74,14 @@ const PostImageSelect: React.FC = () => { setActive(false); if (event.dataTransfer.files) { - handleProcessFile(event.dataTransfer.files); + processFile(event.dataTransfer.files); } }; const handleFileInputChange = (event: React.ChangeEvent) => { event.preventDefault(); if (event.target.files) { - handleProcessFile(event.target.files); + processFile(event.target.files); // 파일 선택 후 input 값 초기화 if (fileInputRef.current) { fileInputRef.current.value = ''; // input 값을 초기화하여 동일한 파일을 다시 추가할 수 있도록 함 @@ -89,7 +89,7 @@ const PostImageSelect: React.FC = () => { } }; - const handleProcessFile = async (files: FileList) => { + const processFile = async (files: FileList) => { const filesArray = Array.from(files); for (const file of filesArray) { try { @@ -111,7 +111,7 @@ const PostImageSelect: React.FC = () => { reader.readAsDataURL(fileBlob); reader.onload = () => { if (reader.result) { - handleAddImage(reader.result.toString()); + handleImageAdd(reader.result.toString()); } }; } catch (error) { @@ -121,14 +121,14 @@ const PostImageSelect: React.FC = () => { } }; - const handleAddImage = (newImage: string) => { + const handleImageAdd = (newImage: string) => { setImages((prevImages) => { const maxOrderNum = prevImages.reduce((max, img) => (img.orderNum > max ? img.orderNum : max), -1); return [...prevImages, { url: newImage, orderNum: maxOrderNum + 1 }]; }); }; - const handleRemoveImage = (image: string) => { + const handleImageRemove = (image: string) => { // 이미지가 1개일 때는 삭제 할 수 없음 if (images.length > 1) { const newImages = images.filter((img) => img.url !== image); @@ -160,13 +160,13 @@ const PostImageSelect: React.FC = () => { ) : ( - + )} From 2d324bf8d3ca76a016f8142e1fe15fc1706717bb Mon Sep 17 00:00:00 2001 From: xxinzzi <156905845+xxinzzi@users.noreply.github.com> Date: Tue, 31 Dec 2024 17:46:10 +0900 Subject: [PATCH 07/27] =?UTF-8?q?Refactor:=20PostUpload=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SearchBottomSheetContent/index.tsx | 68 +++++----- src/pages/Post/PostUpload/index.tsx | 128 +++++++++--------- 2 files changed, 98 insertions(+), 98 deletions(-) diff --git a/src/pages/Post/PostUpload/SearchBottomSheetContent/index.tsx b/src/pages/Post/PostUpload/SearchBottomSheetContent/index.tsx index 66cb32da..daf37bc5 100644 --- a/src/pages/Post/PostUpload/SearchBottomSheetContent/index.tsx +++ b/src/pages/Post/PostUpload/SearchBottomSheetContent/index.tsx @@ -19,11 +19,41 @@ const SearchBottomSheetContent: React.FC = ({ onClose, o const observerRef = useRef(null); const loadMoreRef = useRef(null); + const handleCloseSheet = () => { + onClose(); + }; + const handleInputChange = (query: string) => { setSearchQuery(query); }; - const fetchSearchResult = async (searchQuery: string, start: number) => { + const handleClothingInfoAdd = (item: any) => { + onSelectClothingInfo({ + imageUrl: item.image, + brandName: item.brand, + modelName: removeBrandFromTitle(item.title, item.brand), //검색 결과에서 태그 제거하고 텍스트만 표시 + modelNumber: '1', + url: item.link, + }); + onClose(); + }; + + const removeBrandFromTitle = (title: string, brand: string) => { + // 브랜드 이름에서 특수 문자를 이스케이프 처리하여 정규 표현식에서 사용할 수 있도록 변환 + const escapedBrand = brand.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + // 브랜드 이름을 감싸고 있는 [ ]를 제거 + const bracketRegex = new RegExp(`[\\[\\]()<>]*${escapedBrand}[\\[\\]()<>]*`, 'gi'); //gi: 대소문자 구분 없이(g) 모든 위치에서(i) + // 변환된 브랜드 이름을 제거 + const brandRegex = new RegExp(escapedBrand, 'gi'); + // 제목에서 브랜드 이름과 태그를 제거하고 양쪽 끝의 공백을 제거 + return title + .replace(/<[^>]+>/g, '') + .replace(bracketRegex, '') + .replace(brandRegex, '') + .trim(); + }; + + const getSearchResult = async (searchQuery: string, start: number) => { try { //네이버 쇼핑 api 프록시 서버 사용 const response = await axios.get( @@ -56,7 +86,7 @@ const SearchBottomSheetContent: React.FC = ({ onClose, o setReachedEnd(false); if (searchQuery) { - fetchSearchResult(searchQuery, 1).then((data) => { + getSearchResult(searchQuery, 1).then((data) => { if (data) { setSearchResult(data.items); } else { @@ -77,7 +107,7 @@ const SearchBottomSheetContent: React.FC = ({ onClose, o if (!reachedEnd && searchQuery) { setIsLoading(true); - const data = await fetchSearchResult(searchQuery, start); + const data = await getSearchResult(searchQuery, start); if (data) { setSearchResult((prevResult) => [...prevResult, ...data.items]); @@ -118,36 +148,6 @@ const SearchBottomSheetContent: React.FC = ({ onClose, o }; }, [reachedEnd, searchQuery, isLoading, searchResult]); - const handleAddClothingInfo = (item: any) => { - onSelectClothingInfo({ - imageUrl: item.image, - brandName: item.brand, - modelName: removeBrandFromTitle(item.title, item.brand), //검색 결과에서 태그 제거하고 텍스트만 표시 - modelNumber: '1', - url: item.link, - }); - onClose(); - }; - - const removeBrandFromTitle = (title: string, brand: string) => { - // 브랜드 이름에서 특수 문자를 이스케이프 처리하여 정규 표현식에서 사용할 수 있도록 변환 - const escapedBrand = brand.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - // 브랜드 이름을 감싸고 있는 [ ]를 제거 - const bracketRegex = new RegExp(`[\\[\\]()<>]*${escapedBrand}[\\[\\]()<>]*`, 'gi'); //gi: 대소문자 구분 없이(g) 모든 위치에서(i) - // 변환된 브랜드 이름을 제거 - const brandRegex = new RegExp(escapedBrand, 'gi'); - // 제목에서 브랜드 이름과 태그를 제거하고 양쪽 끝의 공백을 제거 - return title - .replace(/<[^>]+>/g, '') - .replace(bracketRegex, '') - .replace(brandRegex, '') - .trim(); - }; - - const handleCloseSheet = () => { - onClose(); - }; - return (
@@ -164,7 +164,7 @@ const SearchBottomSheetContent: React.FC = ({ onClose, o {searchQuery && searchResult.length > 0 ? ( {searchResult.map((searchResultItem, index) => ( - handleAddClothingInfo(searchResultItem)}> + handleClothingInfoAdd(searchResultItem)}> {searchResultItem.title.replace(/<[^]+>/g, '')} />
diff --git a/src/pages/Post/PostUpload/index.tsx b/src/pages/Post/PostUpload/index.tsx index 988b0289..32c75f3d 100644 --- a/src/pages/Post/PostUpload/index.tsx +++ b/src/pages/Post/PostUpload/index.tsx @@ -84,21 +84,6 @@ const PostUpload: React.FC = () => { 'luxury', ]; - // 게시물 업로드인지 수정인지 모드 확인 - useEffect(() => { - const handleMode = async () => { - const state = location.state as { mode?: string; postId?: number }; - if (state?.mode) { - setMode(state.mode); // 모드 상태를 설정 - } - if (state.mode === 'edit' && state?.postId && selectedImages.length === 0) { - await getPost(state.postId); - } - }; - - handleMode(); - }, []); - const handlePrev = () => { const state = location.state as { mode?: string; postId?: number }; if (mode === 'edit') { @@ -107,37 +92,19 @@ const PostUpload: React.FC = () => { navigate('/post/upload/photo/select', { state: { mode: mode, postId: state.postId } }); }; - const getPost = async (postId: number) => { - setIsLoading(true); - - try { - const response = await getPostDetailApi(postId); - - const { postImages, content, postStyletags, postClothings, isRepresentative } = response.data; - - setSelectedImages(postImages); - setContent(content); - setClothingInfos(postClothings ?? []); - setSelectedStyletag(postStyletags); - setIsRepresentative(isRepresentative); - } catch (error) { - const errorMessage = handleError(error, 'post'); - setModalContent(errorMessage); - setIsStatusModalOpen(true); - } finally { - setIsLoading(false); - } - }; - - const handleToggleSearchSheet = () => { + const handleSearchSheetToggle = () => { setIsSearchBottomSheetOpen((open) => !open); }; - const handleToggleStyleTagList = () => { + const handleStyleTagListToggle = () => { setIsStyletagListOpen((open) => !open); }; - const handleAddClothingInfo = (newClothingInfo: ClothingInfo) => { + const handleIsRepresentativeToggle = () => { + setIsRepresentative((isRepresentative) => !isRepresentative); + }; + + const handleClothingInfoAdd = (newClothingInfo: ClothingInfo) => { setClothingInfos((clothingInfos) => { // 중복 확인 (새로운 의류 정보가 이미 존재하지 않을 경우 추가) const isDuplicate = clothingInfos.some( @@ -151,25 +118,12 @@ const PostUpload: React.FC = () => { }); }; - const handleDeleteClothingInfo = (deleteClothingInfo: ClothingInfo) => { + const handleClothingInfoDelete = (deleteClothingInfo: ClothingInfo) => { const deletedClothingInfo = clothingInfos.filter((clothing) => clothing !== deleteClothingInfo); setClothingInfos(deletedClothingInfo); }; - const bottomSheetProps: BottomSheetProps = { - isOpenBottomSheet: isSearchBottomSheetOpen, - isHandlerVisible: false, - Component: SearchBottomSheetContent, - onCloseBottomSheet: () => { - setIsSearchBottomSheetOpen(false); - }, - componentProps: { - onClose: () => setIsSearchBottomSheetOpen(false), - onSelectClothingInfo: handleAddClothingInfo, - }, - }; - - const handleSelectStyletag = (tag: string) => { + const handleStyletagSelect = (tag: string) => { setSelectedStyletag((prev) => { // 선택된 태그가 이미 존재하면 제거 if (prev.includes(tag)) { @@ -181,10 +135,6 @@ const PostUpload: React.FC = () => { setIsStyletagListOpen(false); }; - const handleToggleIsRepresentative = () => { - setIsRepresentative(!isRepresentative); - }; - const cropImage = (imageUrl: string): Promise => { return new Promise((resolve) => { const img = new Image(); @@ -300,6 +250,56 @@ const PostUpload: React.FC = () => { } }; + const getPost = async (postId: number) => { + setIsLoading(true); + + try { + const response = await getPostDetailApi(postId); + + const { postImages, content, postStyletags, postClothings, isRepresentative } = response.data; + + setSelectedImages(postImages); + setContent(content); + setClothingInfos(postClothings ?? []); + setSelectedStyletag(postStyletags); + setIsRepresentative(isRepresentative); + } catch (error) { + const errorMessage = handleError(error, 'post'); + setModalContent(errorMessage); + setIsStatusModalOpen(true); + } finally { + setIsLoading(false); + } + }; + + // 게시물 업로드인지 수정인지 모드 확인 + useEffect(() => { + const handleMode = async () => { + const state = location.state as { mode?: string; postId?: number }; + if (state?.mode) { + setMode(state.mode); // 모드 상태를 설정 + } + if (state.mode === 'edit' && state?.postId && selectedImages.length === 0) { + await getPost(state.postId); + } + }; + + handleMode(); + }, []); + + const bottomSheetProps: BottomSheetProps = { + isOpenBottomSheet: isSearchBottomSheetOpen, + isHandlerVisible: false, + Component: SearchBottomSheetContent, + onCloseBottomSheet: () => { + setIsSearchBottomSheetOpen(false); + }, + componentProps: { + onClose: () => setIsSearchBottomSheetOpen(false), + onSelectClothingInfo: handleClothingInfoAdd, + }, + }; + // api 처리 상태 모달 (성공/실패) const statusModalProps: ModalProps = { content: modalContent, @@ -320,7 +320,7 @@ const PostUpload: React.FC = () => { placeholder="문구를 작성하세요..." /> -
+
옷 정보 태그 @@ -335,13 +335,13 @@ const PostUpload: React.FC = () => { {clothingInfos.length > 0 && ( {clothingInfos.map((clothingObj, index) => ( - + ))} )} -
+
스타일 태그 @@ -368,7 +368,7 @@ const PostUpload: React.FC = () => { {styletags.map((tag) => ( handleSelectStyletag(tag)} + onClick={() => handleStyletagSelect(tag)} selected={selectedStyletag[0] === tag} > @@ -383,7 +383,7 @@ const PostUpload: React.FC = () => { 대표 OOTD 지정
- +
From 9ff753d1cfeff9bd4925fb3c4ef92e041552e870 Mon Sep 17 00:00:00 2001 From: xxinzzi <156905845+xxinzzi@users.noreply.github.com> Date: Thu, 2 Jan 2025 15:03:57 +0900 Subject: [PATCH 08/27] =?UTF-8?q?Refator:=20=EC=BB=AC=EB=9F=AC=EC=8B=9C?= =?UTF-8?q?=EC=8A=A4=ED=85=9C=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/NotFound/index.tsx | 4 +- src/pages/NotFound/styles.tsx | 4 +- src/pages/Post/PostBase/ImageSwiper/index.tsx | 2 +- .../CommentItem/index.tsx | 2 +- .../MenuButtonList/styles.tsx | 2 +- .../LikeCommentBottomSheetContent/index.tsx | 13 +- .../LikeCommentBottomSheetContent/styles.tsx | 8 +- src/pages/Post/PostBase/index.tsx | 14 +- src/pages/Post/PostBase/styles.tsx | 16 +- src/pages/Post/PostImageSelect/styles.tsx | 1 - src/pages/Post/PostInstaConnect/index.tsx | 2 +- src/pages/Post/PostInstaConnect/styles.tsx | 10 +- .../Post/PostUpload/ImageSwiper/styles.tsx | 2 +- .../SearchBottomSheetContent/index.tsx | 4 +- .../SearchBottomSheetContent/styles.tsx | 22 +-- .../Post/PostUpload/ToggleSwitch/styles.tsx | 8 +- src/pages/Post/PostUpload/styles.tsx | 28 ++-- src/pages/Post/index.tsx | 2 +- src/pages/Post/styles.tsx | 4 +- src/pages/TermsAgreement/index.tsx | 138 ++++++++++++++++++ 20 files changed, 215 insertions(+), 71 deletions(-) create mode 100644 src/pages/TermsAgreement/index.tsx diff --git a/src/pages/NotFound/index.tsx b/src/pages/NotFound/index.tsx index 7afc7f13..43ae17b1 100644 --- a/src/pages/NotFound/index.tsx +++ b/src/pages/NotFound/index.tsx @@ -14,7 +14,7 @@ const NotFound = () => { - + 404 ERROR 죄송합니다. 페이지를 찾을 수 없습니다. @@ -26,7 +26,7 @@ const NotFound = () => {
- + 메인으로 theme.colors.pink3}; + border: 1px solid ${({ theme }) => theme.colors.brand.primary}; border-radius: 8px; cursor: pointer; text-decoration: none; &.prev { - background-color: ${({ theme }) => theme.colors.pink3}; + background-color: ${({ theme }) => theme.colors.brand.primary}; color: ${({ theme }) => theme.colors.white}; } `; diff --git a/src/pages/Post/PostBase/ImageSwiper/index.tsx b/src/pages/Post/PostBase/ImageSwiper/index.tsx index d813bb13..8142afa8 100644 --- a/src/pages/Post/PostBase/ImageSwiper/index.tsx +++ b/src/pages/Post/PostBase/ImageSwiper/index.tsx @@ -6,7 +6,7 @@ import 'swiper/css'; import 'swiper/css/navigation'; import 'swiper/css/pagination'; -import { ImageSwiperProps } from '../dto'; +import type { ImageSwiperProps } from '../dto'; import { SwiperContainer, ImageWrapper, StyledNavigation } from './styles'; diff --git a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/CommentItem/index.tsx b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/CommentItem/index.tsx index 5deb501a..5f4e425e 100644 --- a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/CommentItem/index.tsx +++ b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/CommentItem/index.tsx @@ -38,7 +38,7 @@ const CommentItem: React.FC = ({ comment, handleUserClick, han {comment.content} - + {timeAgo} handleMenuOpen(comment, event)}> diff --git a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/MenuButtonList/styles.tsx b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/MenuButtonList/styles.tsx index 579a1de7..cfaaeccd 100644 --- a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/MenuButtonList/styles.tsx +++ b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/MenuButtonList/styles.tsx @@ -33,7 +33,7 @@ export const MenuButtonItem = styled.button<{ $color?: string }>` width: 120px; padding: 0 10px; cursor: pointer; - color: ${(props) => props.$color || props.theme.colors.white}; + color: ${(props) => props.$color || props.theme.colors.text.primary}; border-bottom: 1px solid ${({ theme }) => theme.colors.white}; img { diff --git a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx index 00e3f978..300a1e60 100644 --- a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx +++ b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx @@ -25,6 +25,8 @@ import X from '@assets/default/x.svg'; import Loading from '@components/Loading'; import Modal from '@components/Modal'; import { StyledText } from '@components/Text/StyledText'; +import CommentItem from './CommentItem/index'; +import MenuButtonList from './MenuButtonList/index'; import type { Comment, GetCommentListResponse } from '@apis/post-comment/dto'; import type { GetPostLikeListResponse } from '@apis/post-like/dto'; @@ -32,9 +34,6 @@ import type { ModalProps } from '@components/Modal/dto'; import type { LikeCommentBottomSheetProps } from '../dto'; -import CommentItem from './CommentItem/index'; -import MenuButtonList from './MenuButtonList/index'; - import { TabContainer, Tab, ContentContainer, Content, BigUserProfile, LikeItem, InputLayout } from './styles'; const LikeCommentBottomSheetContent: React.FC = ({ tab, likeCount, commentCount }) => { @@ -338,7 +337,7 @@ const LikeCommentBottomSheetContent: React.FC = ({ setActiveTab('likes')}> 좋아요 {postLikeCount || 0} @@ -346,7 +345,7 @@ const LikeCommentBottomSheetContent: React.FC = ({ setActiveTab('comments')}> 코멘트 {postCommentCount || 0} @@ -356,7 +355,7 @@ const LikeCommentBottomSheetContent: React.FC = ({ {activeTab === 'likes' && (postLikeCount === 0 ? ( - + 아직 좋아요가 없습니다 ) : ( @@ -375,7 +374,7 @@ const LikeCommentBottomSheetContent: React.FC = ({ {activeTab === 'comments' && ( <> {postCommentCount === 0 ? ( - + 아직 댓글이 없습니다 ) : ( diff --git a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/styles.tsx b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/styles.tsx index 4a481925..c61584f1 100644 --- a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/styles.tsx +++ b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/styles.tsx @@ -80,7 +80,7 @@ export const InputLayout = styled.div` align-items: center; gap: 10px; background-color: white; - border-top: 1px solid ${({ theme }) => theme.colors.border.devider}; + border-top: 1px solid ${({ theme }) => theme.colors.border.divider}; textarea { flex: 1; @@ -89,7 +89,7 @@ export const InputLayout = styled.div` height: 50px; max-height: 70px; border-radius: 8px; - border: 0.0625rem solid #ededed; + border: 0.0625rem solid ${({ theme }) => theme.colors.border.divider}; outline: none; padding: 0.8125rem 0.9375rem; font-family: 'Pretendard Variable'; @@ -97,8 +97,8 @@ export const InputLayout = styled.div` font-style: normal; font-weight: 300; line-height: 150%; - color: #1d1d1d; - background-color: #f8f8f8; + color: ${({ theme }) => theme.colors.text.secondary}; + background-color: ${({ theme }) => theme.colors.background.secondary}; resize: none; overflow-y: auto; diff --git a/src/pages/Post/PostBase/index.tsx b/src/pages/Post/PostBase/index.tsx index 074145ed..08c15d67 100644 --- a/src/pages/Post/PostBase/index.tsx +++ b/src/pages/Post/PostBase/index.tsx @@ -164,10 +164,18 @@ const PostBase: React.FC = ({ onClickMenu }) => { {post?.user && profileImg} - + {user.nickname} - + {timeAgo} @@ -208,7 +216,7 @@ const PostBase: React.FC = ({ onClickMenu }) => { onClick={toggleTextDisplay} $showFullText={showFullText} $textTheme={{ style: 'body4-light' }} - color={theme.colors.black} + color={theme.colors.text.primary} > {post.content} diff --git a/src/pages/Post/PostBase/styles.tsx b/src/pages/Post/PostBase/styles.tsx index 856e812d..e77127fc 100644 --- a/src/pages/Post/PostBase/styles.tsx +++ b/src/pages/Post/PostBase/styles.tsx @@ -16,9 +16,9 @@ const shimmer = keyframes` const LoadingSkeleton = styled.div` background: linear-gradient( 90deg, - ${({ theme }) => theme.colors.gray1} 25%, - ${({ theme }) => theme.colors.gray2} 50%, - ${({ theme }) => theme.colors.gray1} 75% + ${({ theme }) => theme.colors.gray[200]} 25%, + ${({ theme }) => theme.colors.gray[300]} 50%, + ${({ theme }) => theme.colors.gray[200]} 75% ); background-size: 200% 100%; animation: ${shimmer} 2s infinite; @@ -79,7 +79,7 @@ export const UserProfile = styled(LoadingSkeleton)` height: 32px; border-radius: 50%; overflow: hidden; - border: solid 0.5px ${({ theme }) => theme.colors.gray1}; + border: solid 0.5px ${({ theme }) => theme.colors.border.divider}; img { width: 100%; @@ -120,7 +120,7 @@ export const Content = styled(StyledText)<{ $showFullText: boolean }>` export const ShowMoreButton = styled(StyledText)` cursor: pointer; - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; `; export const ImageSkeleton = styled(LoadingSkeleton)` @@ -143,7 +143,7 @@ export const IconWrapper = styled.div` span { font-size: 15px; - color: #000; + color: ${({ theme }) => theme.colors.text.primary}; margin-right: 16px; } `; @@ -185,7 +185,7 @@ export const InputLayout = styled.div` width: calc(100% - 3rem); height: 5.75rem; border-radius: 0.125rem; - border: 0.0625rem solid ${({ theme }) => theme.colors.gray3}; + border: 0.0625rem solid ${({ theme }) => theme.colors.border.divider}; margin-bottom: 5.875rem; z-index: 2; margin-top: -3.75rem; @@ -196,7 +196,7 @@ export const InputLayout = styled.div` font-style: normal; font-weight: 300; line-height: 150%; - color: ${({ theme }) => theme.colors.black}; + color: ${({ theme }) => theme.colors.text.primary}; resize: none; } `; diff --git a/src/pages/Post/PostImageSelect/styles.tsx b/src/pages/Post/PostImageSelect/styles.tsx index 98cab6b6..e131c00b 100644 --- a/src/pages/Post/PostImageSelect/styles.tsx +++ b/src/pages/Post/PostImageSelect/styles.tsx @@ -49,7 +49,6 @@ export const Content = styled.div` top: 2.75rem; left: 0; width: 100%; - //max-width: 512px; height: calc(100% - 10rem); flex: 1; `; diff --git a/src/pages/Post/PostInstaConnect/index.tsx b/src/pages/Post/PostInstaConnect/index.tsx index f7eb9450..7a535d68 100644 --- a/src/pages/Post/PostInstaConnect/index.tsx +++ b/src/pages/Post/PostInstaConnect/index.tsx @@ -75,7 +75,7 @@ const PostInstaConnect: React.FC = () => { {!instagramID ? '탭해서 ID를 작성하세요' : ' .'} diff --git a/src/pages/Post/PostInstaConnect/styles.tsx b/src/pages/Post/PostInstaConnect/styles.tsx index f4c9c7dc..5a85b457 100644 --- a/src/pages/Post/PostInstaConnect/styles.tsx +++ b/src/pages/Post/PostInstaConnect/styles.tsx @@ -38,31 +38,31 @@ export const StyledInput = styled.input` } ::placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; ${({ theme }) => theme.fontStyles['title1-regular']} } /* Firefox */ &:-moz-placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; ${({ theme }) => theme.fontStyles['title1-regular']} } /* Internet Explorer 10-11 */ &:-ms-input-placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; ${({ theme }) => theme.fontStyles['title1-regular']} } /* Edge */ &::-ms-input-placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; ${({ theme }) => theme.fontStyles['title1-regular']} } /* Safari */ &::placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; ${({ theme }) => theme.fontStyles['title1-regular']} } `; diff --git a/src/pages/Post/PostUpload/ImageSwiper/styles.tsx b/src/pages/Post/PostUpload/ImageSwiper/styles.tsx index 0f216167..e50a90fd 100644 --- a/src/pages/Post/PostUpload/ImageSwiper/styles.tsx +++ b/src/pages/Post/PostUpload/ImageSwiper/styles.tsx @@ -83,7 +83,7 @@ export const StyledPagination = styled.div` width: 65px; height: 34px; color: white; - background: ${({ theme }) => theme.colors.gradient}; + background: ${({ theme }) => theme.colors.brand.gradient}; border-radius: 17px; .swiper-pagination-custom { diff --git a/src/pages/Post/PostUpload/SearchBottomSheetContent/index.tsx b/src/pages/Post/PostUpload/SearchBottomSheetContent/index.tsx index daf37bc5..5f246c27 100644 --- a/src/pages/Post/PostUpload/SearchBottomSheetContent/index.tsx +++ b/src/pages/Post/PostUpload/SearchBottomSheetContent/index.tsx @@ -173,7 +173,7 @@ const SearchBottomSheetContent: React.FC = ({ onClose, o {removeBrandFromTitle(searchResultItem.title, searchResultItem.brand)} @@ -183,7 +183,7 @@ const SearchBottomSheetContent: React.FC = ({ onClose, o
{isLoading && ( - + 로딩 중 diff --git a/src/pages/Post/PostUpload/SearchBottomSheetContent/styles.tsx b/src/pages/Post/PostUpload/SearchBottomSheetContent/styles.tsx index fdee8c66..5dfa0dee 100644 --- a/src/pages/Post/PostUpload/SearchBottomSheetContent/styles.tsx +++ b/src/pages/Post/PostUpload/SearchBottomSheetContent/styles.tsx @@ -11,11 +11,11 @@ export const Content = styled.div` width: 100%; padding: 0.825rem 0; - border-bottom: solid 0.0625rem ${({ theme }) => theme.colors.gray1}; + border-bottom: solid 0.0625rem ${({ theme }) => theme.colors.border.divider}; div { padding-left: 1.25rem; - color: ${({ theme }) => theme.colors.black}; + color: ${({ theme }) => theme.colors.text.primary}; cursor: pointer; } } @@ -28,7 +28,7 @@ export const Input = styled.input` text-align: left; font-size: 1rem; background-color: #f8f8f8; - border: 0.0625rem solid ${({ theme }) => theme.colors.gray2}; + border: 0.0625rem solid ${({ theme }) => theme.colors.border.divider}; border-radius: 0.3125rem; &:focus { @@ -36,7 +36,7 @@ export const Input = styled.input` } ::placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; font-family: 'Pretendard Variable'; font-weight: 300; font-size: 1rem; @@ -44,7 +44,7 @@ export const Input = styled.input` /* Firefox */ &:-moz-placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; font-family: 'Pretendard Variable'; font-weight: 300; font-size: 1rem; @@ -52,7 +52,7 @@ export const Input = styled.input` /* Internet Explorer 10-11 */ &:-ms-input-placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; font-family: 'Pretendard Variable'; font-weight: 300; font-size: 1rem; @@ -60,7 +60,7 @@ export const Input = styled.input` /* Edge */ &::-ms-input-placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; font-family: 'Pretendard Variable'; font-weight: 300; font-size: 1rem; @@ -68,7 +68,7 @@ export const Input = styled.input` /* Safari */ &::placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; font-family: 'Pretendard Variable'; font-weight: 300; font-size: 1rem; @@ -90,7 +90,7 @@ export const SearchResultList = styled.div` } .total { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; } .ref { @@ -104,7 +104,7 @@ export const SearchResultItem = styled.div` flex-direction: row; width: 100%; height: 5.625rem; - border-bottom: solid 0.0625rem ${({ theme }) => theme.colors.gray1}; + border-bottom: solid 0.0625rem ${({ theme }) => theme.colors.border.divider}; padding: 0.9375rem 0; cursor: pointer; @@ -131,7 +131,7 @@ export const SearchResultItem = styled.div` .detail { margin-right: auto; - color: ${({ theme }) => theme.colors.black}; + color: ${({ theme }) => theme.colors.text.primary}; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; diff --git a/src/pages/Post/PostUpload/ToggleSwitch/styles.tsx b/src/pages/Post/PostUpload/ToggleSwitch/styles.tsx index 1672e375..b8d69b7c 100644 --- a/src/pages/Post/PostUpload/ToggleSwitch/styles.tsx +++ b/src/pages/Post/PostUpload/ToggleSwitch/styles.tsx @@ -3,7 +3,7 @@ import { styled } from 'styled-components'; export const HiddenCheckbox = styled.input.attrs({ type: 'checkbox' })` appearance: none; position: relative; - border: 1.5px solid ${({ theme }) => theme.colors.pink3}; + border: 1.5px solid ${({ theme }) => theme.colors.brand.primary}; border-radius: 28px; width: 52px; height: 28px; @@ -19,13 +19,13 @@ export const HiddenCheckbox = styled.input.attrs({ type: 'checkbox' })` height: 25px; border-radius: 50%; background-color: ${({ theme }) => theme.colors.white}; - border: 1.5px solid ${({ theme }) => theme.colors.pink3}; + border: 1.5px solid ${({ theme }) => theme.colors.border.active}; transition: left 250ms linear; } &:checked { - background: ${({ theme }) => theme.colors.gradient}; - border: 1.5px solid ${({ theme }) => theme.colors.gradient}; + background: ${({ theme }) => theme.colors.brand.gradient}; + border: 1.5px solid ${({ theme }) => theme.colors.brand.gradient}; } &:checked::before { diff --git a/src/pages/Post/PostUpload/styles.tsx b/src/pages/Post/PostUpload/styles.tsx index bd8ef4fe..17a34396 100644 --- a/src/pages/Post/PostUpload/styles.tsx +++ b/src/pages/Post/PostUpload/styles.tsx @@ -46,7 +46,7 @@ export const StyledInput = styled.textarea` } ::placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; font-family: 'Pretendard Variable'; font-weight: 300; font-size: 1rem; @@ -54,7 +54,7 @@ export const StyledInput = styled.textarea` /* Firefox */ &:-moz-placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; font-family: 'Pretendard Variable'; font-weight: 300; font-size: 1rem; @@ -62,7 +62,7 @@ export const StyledInput = styled.textarea` /* Internet Explorer 10-11 */ &:-ms-input-placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; font-family: 'Pretendard Variable'; font-weight: 300; font-size: 1rem; @@ -70,7 +70,7 @@ export const StyledInput = styled.textarea` /* Edge */ &::-ms-input-placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; font-family: 'Pretendard Variable'; font-weight: 300; font-size: 1rem; @@ -78,7 +78,7 @@ export const StyledInput = styled.textarea` /* Safari */ &::placeholder { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; font-family: 'Pretendard Variable'; font-weight: 300; font-size: 1rem; @@ -89,11 +89,11 @@ export const TagContainer = styled.div` display: flex; flex-direction: column; justify-content: center; - border-bottom: 0.0625rem solid ${({ theme }) => theme.colors.gray1}; + border-bottom: 0.0625rem solid ${({ theme }) => theme.colors.border.divider}; .label { padding: 0 0.9375rem; - color: ${({ theme }) => theme.colors.black}; + color: ${({ theme }) => theme.colors.text.primary}; } > div { @@ -113,18 +113,18 @@ export const TagContainer = styled.div` } .count { - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; } &.clothingTag { - border-top: 0.0625rem solid ${({ theme }) => theme.colors.gray1}; + border-top: 0.0625rem solid ${({ theme }) => theme.colors.border.divider}; right: 0.9375rem; } .not_selected { position: absolute; right: 2.8125rem; - color: ${({ theme }) => theme.colors.gray3}; + color: ${({ theme }) => theme.colors.text.tertiary}; } `; @@ -162,13 +162,13 @@ export const StyletagItem = styled.span<{ selected: boolean }>` padding: 0 0.65rem; height: 2rem; //min-width: 4.375rem; - background: ${({ selected, theme }) => (selected ? theme.colors.gradient : 'none')}; - border: 1px solid ${({ theme }) => theme.colors.pink2}; + background: ${({ selected, theme }) => (selected ? theme.colors.brand.gradient : 'none')}; + border: 1px solid ${({ theme }) => theme.colors.border.inactive}; border-radius: 8px; cursor: pointer; .tag { - color: ${({ selected, theme }) => (selected ? theme.colors.white : theme.colors.pink3)}; + color: ${({ selected, theme }) => (selected ? theme.colors.white : theme.colors.brand.primary)}; } `; @@ -180,7 +180,7 @@ export const PinnedPostToggleContainer = styled.label` :nth-child(2) { padding: 1.25rem 0.9375rem; - color: ${({ theme }) => theme.colors.black}; + color: ${({ theme }) => theme.colors.text.primary}; } div:last-child { diff --git a/src/pages/Post/index.tsx b/src/pages/Post/index.tsx index b3b8b0d7..baddc707 100644 --- a/src/pages/Post/index.tsx +++ b/src/pages/Post/index.tsx @@ -37,8 +37,8 @@ const Post: React.FC = () => { const [modalContent, setModalContent] = useState(''); const [postPinStatus, setPostPinStatus] = useState<'지정' | '해제'>('지정'); - const userId = getCurrentUserId(); const navigate = useNavigate(); + const userId = getCurrentUserId(); const handleMenuOpen = () => { if (isMyPost) { diff --git a/src/pages/Post/styles.tsx b/src/pages/Post/styles.tsx index 437fc956..5e347dfe 100644 --- a/src/pages/Post/styles.tsx +++ b/src/pages/Post/styles.tsx @@ -11,7 +11,7 @@ export const InputLayout = styled.div` width: calc(100% - 3rem); height: 5.75rem; border-radius: 0.125rem; - border: 0.0625rem solid ${({ theme }) => theme.colors.gray3}; + border: 0.0625rem solid ${({ theme }) => theme.colors.gray[600]}; margin-bottom: 5.875rem; z-index: 2; margin-top: -3.75rem; @@ -22,7 +22,7 @@ export const InputLayout = styled.div` font-style: normal; font-weight: 300; line-height: 150%; - color: ${({ theme }) => theme.colors.black}; + color: ${({ theme }) => theme.colors.text.primary}; resize: none; } `; diff --git a/src/pages/TermsAgreement/index.tsx b/src/pages/TermsAgreement/index.tsx new file mode 100644 index 00000000..648296c2 --- /dev/null +++ b/src/pages/TermsAgreement/index.tsx @@ -0,0 +1,138 @@ +import React, { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; + +import { postTermsAgreementApi } from '@apis/user'; +import { handleError } from '@apis/util/handleError'; + +import Back from '@assets/arrow/left.svg'; +import OODDlogo from '@assets/default/oodd.svg'; + +import { OODDFrame } from '@components/Frame/Frame'; +import { StyledText } from '@components/Text/StyledText'; +import BottomButton from '@components/BottomButton'; +import TopBar from '@components/TopBar'; +import Modal from '@components/Modal'; + +import { getCurrentUserId } from '@utils/getCurrentUserId'; + +import { LogoWrapper, LogoImg } from '@pages/SignUp/style'; + +import { TermsAgreementLayout, StyledTitle, CheckboxList, CheckboxItem, CheckboxInput, Divider } from './styles'; + +const TermsAgreement: React.FC = () => { + const [isModalOpen, setIsModalOpen] = useState(false); + const [modalMessage, setModalMessage] = useState(''); + + const navigate = useNavigate(); + const currentUserId = getCurrentUserId(); + + const [agreements, setAgreements] = useState({ + all: false, + terms: false, + privacy: false, + marketing: false, + }); + + const checkboxData: { key: keyof typeof agreements; label: string }[] = [ + { key: 'terms', label: '이용약관 동의 (필수)' }, + { key: 'privacy', label: '개인정보 수집 및 이용 동의 (필수)' }, + { key: 'marketing', label: '광고성 정보 수신 동의 (선택)' }, + ]; + + const handleAgreementChange = (key: keyof typeof agreements) => { + setAgreements((prev) => { + const updated = { ...prev, [key]: !prev[key] }; + // 필수 약관이 모두 동의되면 전체 동의 체크 + updated.all = updated.terms && updated.privacy && updated.marketing; + return updated; + }); + }; + + const handleAllAgreementChange = () => { + const newAllState = !agreements.all; + setAgreements({ + all: newAllState, + terms: newAllState, + privacy: newAllState, + marketing: newAllState, + }); + }; + + // 완료 버튼을 눌렀을 때 실행되는 함수 + const handleCompletedClick = async () => { + if (!currentUserId) { + setModalMessage('회원 정보가 없습니다.\n로그인 해 주세요!'); + setIsModalOpen(true); + return; + } + + try { + const response = await postTermsAgreementApi(currentUserId); + console.log(response); + navigate('/'); // 성공 시 홈으로 이동 + } catch (error) { + console.error('약관 동의 API 호출 실패:', error); + const errorMessage = handleError(error); + setModalMessage(errorMessage); + setIsModalOpen(true); + } + }; + + const navigateToLogin = () => { + navigate('/login'); + }; + + return ( + + + + + + + + OODD에 오신 것을 환영해요 🥳 + + + + + + + ㅆ{/*전체 동의와 개별 동의 구분*/} + + {checkboxData.map(({ key, label }) => ( + + handleAgreementChange(key)} + id={key} + /> + + + ))} + + + {isModalOpen && } + + + ); +}; + +export default TermsAgreement; From 19d5a4abd89ef75547e4bd2d10ecedd25b3d3b36 Mon Sep 17 00:00:00 2001 From: xxinzzi <156905845+xxinzzi@users.noreply.github.com> Date: Thu, 2 Jan 2025 15:43:14 +0900 Subject: [PATCH 09/27] =?UTF-8?q?Refactor:=20Icon=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Post/PostBase/index.tsx | 17 +++++++++-------- src/pages/Post/PostBase/styles.tsx | 15 +++++++-------- src/pages/Post/PostImageSelect/index.tsx | 4 ++-- src/pages/Post/PostUpload/ImageSwiper/index.tsx | 6 ++++-- .../Post/PostUpload/ImageSwiper/styles.tsx | 7 ++----- 5 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/pages/Post/PostBase/index.tsx b/src/pages/Post/PostBase/index.tsx index 08c15d67..b0c904bc 100644 --- a/src/pages/Post/PostBase/index.tsx +++ b/src/pages/Post/PostBase/index.tsx @@ -13,8 +13,7 @@ import { postIdAtom, userAtom, isPostRepresentativeAtom } from '@recoil/Post/Pos import { getCurrentUserId } from '@utils/getCurrentUserId'; import Left from '@assets/arrow/left.svg'; -import LikeFill from '@assets/default/like-fill.svg'; -import Like from '@assets/default/like.svg'; +import Like from '@components/Icons/Like'; import Message from '@assets/default/message.svg'; import More from '@assets/default/more.svg'; @@ -185,16 +184,18 @@ const PostBase: React.FC = ({ onClickMenu }) => { {!post ? : image.url)} />} - - {post?.postClothings?.map((clothingObj, index) => ( - - ))} - + {post?.postClothings && ( + + {post.postClothings.map((clothingObj, index) => ( + + ))} + + )} - {post?.isPostLike ? like : like} + {post?.isPostLike ? : } handleLikeCommentOpen('likes')}>{post?.postLikesCount ?? 0} diff --git a/src/pages/Post/PostBase/styles.tsx b/src/pages/Post/PostBase/styles.tsx index e77127fc..a0f40f83 100644 --- a/src/pages/Post/PostBase/styles.tsx +++ b/src/pages/Post/PostBase/styles.tsx @@ -133,6 +133,7 @@ export const IconRow = styled.div` height: 20px; align-items: center; padding: 0 20px; + gap: 16px; `; export const IconWrapper = styled.div` @@ -140,22 +141,20 @@ export const IconWrapper = styled.div` align-items: center; gap: 8px; cursor: pointer; + height: 22px; span { font-size: 15px; color: ${({ theme }) => theme.colors.text.primary}; - margin-right: 16px; } `; export const Icon = styled.div` - width: 20px; - height: 20px; - - img { - width: 20px; - height: 20px; - } + width: 18px; + height: 18px; + display: flex; + align-items: center; + justify-content: center; `; export const ClothingInfoList = styled.div` diff --git a/src/pages/Post/PostImageSelect/index.tsx b/src/pages/Post/PostImageSelect/index.tsx index b398505c..25d54552 100644 --- a/src/pages/Post/PostImageSelect/index.tsx +++ b/src/pages/Post/PostImageSelect/index.tsx @@ -14,8 +14,8 @@ import { import { getCurrentUserId } from '@utils/getCurrentUserId'; import Left from '@assets/arrow/left.svg'; -import PhotoBig from '@assets/default/photo-big.svg'; import X from '@assets/default/x.svg'; +import Photo from '@components/Icons/Photo'; import BottomButton from '@components/BottomButton'; import { OODDFrame } from '@components/Frame/Frame'; @@ -156,7 +156,7 @@ const PostImageSelect: React.FC = () => { 사진을 여기에 끌어다 놓으세요 - + ) : ( diff --git a/src/pages/Post/PostUpload/ImageSwiper/index.tsx b/src/pages/Post/PostUpload/ImageSwiper/index.tsx index 50677c5d..a643f0c2 100644 --- a/src/pages/Post/PostUpload/ImageSwiper/index.tsx +++ b/src/pages/Post/PostUpload/ImageSwiper/index.tsx @@ -1,4 +1,5 @@ import { useRef } from 'react'; +import ReactDOMServer from 'react-dom/server'; import { Navigation, Pagination } from 'swiper/modules'; import { Swiper, SwiperRef, SwiperSlide } from 'swiper/react'; @@ -6,7 +7,7 @@ import 'swiper/css'; import 'swiper/css/navigation'; import 'swiper/css/pagination'; -import PhotoWhite from '@assets/default/photo-white.svg'; +import Photo from '@components/Icons/Photo'; import type { ImageSwiperProps } from '../dto'; @@ -31,9 +32,10 @@ const ImageSwiper: React.FC = ({ images }) => { el: '.swiper-pagination', type: 'custom', renderCustom: (_, current, total) => { + const photoIcon = ReactDOMServer.renderToString(); return `
- Pagination Icon + ${photoIcon} ${current}/${total}
`; }, diff --git a/src/pages/Post/PostUpload/ImageSwiper/styles.tsx b/src/pages/Post/PostUpload/ImageSwiper/styles.tsx index e50a90fd..1bda07f0 100644 --- a/src/pages/Post/PostUpload/ImageSwiper/styles.tsx +++ b/src/pages/Post/PostUpload/ImageSwiper/styles.tsx @@ -82,7 +82,7 @@ export const StyledPagination = styled.div` align-items: center; width: 65px; height: 34px; - color: white; + color: ${({ theme }) => theme.colors.text.contrast}; background: ${({ theme }) => theme.colors.brand.gradient}; border-radius: 17px; @@ -92,11 +92,8 @@ export const StyledPagination = styled.div` justify-content: center; } - .swiper-pagination-custom img { - margin-right: 0.3125rem; - } - span { + margin-left: 0.3125rem; font-family: 'Pretendard Variable'; font-weight: 300; font-size: 0.8125rem; From 5c09412f52150559de4271046e490d07facf2c68 Mon Sep 17 00:00:00 2001 From: xxinzzi <156905845+xxinzzi@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:11:51 +0900 Subject: [PATCH 10/27] =?UTF-8?q?Remove:=20=EC=9E=98=EB=AA=BB=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EB=90=9C=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/TermsAgreement/index.tsx | 138 ----------------------------- 1 file changed, 138 deletions(-) delete mode 100644 src/pages/TermsAgreement/index.tsx diff --git a/src/pages/TermsAgreement/index.tsx b/src/pages/TermsAgreement/index.tsx deleted file mode 100644 index 648296c2..00000000 --- a/src/pages/TermsAgreement/index.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import React, { useState } from 'react'; -import { useNavigate } from 'react-router-dom'; - -import { postTermsAgreementApi } from '@apis/user'; -import { handleError } from '@apis/util/handleError'; - -import Back from '@assets/arrow/left.svg'; -import OODDlogo from '@assets/default/oodd.svg'; - -import { OODDFrame } from '@components/Frame/Frame'; -import { StyledText } from '@components/Text/StyledText'; -import BottomButton from '@components/BottomButton'; -import TopBar from '@components/TopBar'; -import Modal from '@components/Modal'; - -import { getCurrentUserId } from '@utils/getCurrentUserId'; - -import { LogoWrapper, LogoImg } from '@pages/SignUp/style'; - -import { TermsAgreementLayout, StyledTitle, CheckboxList, CheckboxItem, CheckboxInput, Divider } from './styles'; - -const TermsAgreement: React.FC = () => { - const [isModalOpen, setIsModalOpen] = useState(false); - const [modalMessage, setModalMessage] = useState(''); - - const navigate = useNavigate(); - const currentUserId = getCurrentUserId(); - - const [agreements, setAgreements] = useState({ - all: false, - terms: false, - privacy: false, - marketing: false, - }); - - const checkboxData: { key: keyof typeof agreements; label: string }[] = [ - { key: 'terms', label: '이용약관 동의 (필수)' }, - { key: 'privacy', label: '개인정보 수집 및 이용 동의 (필수)' }, - { key: 'marketing', label: '광고성 정보 수신 동의 (선택)' }, - ]; - - const handleAgreementChange = (key: keyof typeof agreements) => { - setAgreements((prev) => { - const updated = { ...prev, [key]: !prev[key] }; - // 필수 약관이 모두 동의되면 전체 동의 체크 - updated.all = updated.terms && updated.privacy && updated.marketing; - return updated; - }); - }; - - const handleAllAgreementChange = () => { - const newAllState = !agreements.all; - setAgreements({ - all: newAllState, - terms: newAllState, - privacy: newAllState, - marketing: newAllState, - }); - }; - - // 완료 버튼을 눌렀을 때 실행되는 함수 - const handleCompletedClick = async () => { - if (!currentUserId) { - setModalMessage('회원 정보가 없습니다.\n로그인 해 주세요!'); - setIsModalOpen(true); - return; - } - - try { - const response = await postTermsAgreementApi(currentUserId); - console.log(response); - navigate('/'); // 성공 시 홈으로 이동 - } catch (error) { - console.error('약관 동의 API 호출 실패:', error); - const errorMessage = handleError(error); - setModalMessage(errorMessage); - setIsModalOpen(true); - } - }; - - const navigateToLogin = () => { - navigate('/login'); - }; - - return ( - - - - - - - - OODD에 오신 것을 환영해요 🥳 - - - - - - - ㅆ{/*전체 동의와 개별 동의 구분*/} - - {checkboxData.map(({ key, label }) => ( - - handleAgreementChange(key)} - id={key} - /> - - - ))} - - - {isModalOpen && } - - - ); -}; - -export default TermsAgreement; From 85410888ab5671eefd042188d8482f3f14fd7964 Mon Sep 17 00:00:00 2001 From: lalaurel Date: Thu, 2 Jan 2025 17:12:35 +0900 Subject: [PATCH 11/27] =?UTF-8?q?refactor:=20text.tertiar=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Account/AccountEdit/index.tsx | 8 ++++---- src/pages/Account/AccountEdit/styles.tsx | 2 +- src/pages/Account/AccountSetting/index.tsx | 2 +- src/pages/Account/Verification/index.tsx | 2 +- src/pages/Profile/ProfileEdit/index.tsx | 14 +++++++------- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/pages/Account/AccountEdit/index.tsx b/src/pages/Account/AccountEdit/index.tsx index fb0bb67a..c6ee9c74 100644 --- a/src/pages/Account/AccountEdit/index.tsx +++ b/src/pages/Account/AccountEdit/index.tsx @@ -47,12 +47,12 @@ const AccountEdit: React.FC = () => { - + SNS 연결 - + 연결된 SNS계정으로 로그인되었습니다. @@ -71,7 +71,7 @@ const AccountEdit: React.FC = () => { @@ -79,7 +79,7 @@ const AccountEdit: React.FC = () => { diff --git a/src/pages/Account/AccountEdit/styles.tsx b/src/pages/Account/AccountEdit/styles.tsx index 2ed8d886..4fb7366f 100644 --- a/src/pages/Account/AccountEdit/styles.tsx +++ b/src/pages/Account/AccountEdit/styles.tsx @@ -46,7 +46,7 @@ export const SNSIcon = styled.img` export const Text = styled.div` font-size: 0.875rem; - color: ${({ theme }) => theme.colors.tertiary}; + color: ${({ theme }) => theme.colors.text.tertiary}; margin-top: 2.1875rem; text-align: left; `; diff --git a/src/pages/Account/AccountSetting/index.tsx b/src/pages/Account/AccountSetting/index.tsx index a23ccb79..c1bfd315 100644 --- a/src/pages/Account/AccountSetting/index.tsx +++ b/src/pages/Account/AccountSetting/index.tsx @@ -95,7 +95,7 @@ const AccountSetting: React.FC = () => { diff --git a/src/pages/Account/Verification/index.tsx b/src/pages/Account/Verification/index.tsx index 6bf7c02f..1a909a01 100644 --- a/src/pages/Account/Verification/index.tsx +++ b/src/pages/Account/Verification/index.tsx @@ -112,7 +112,7 @@ const Verification: React.FC = () => { - <StyledText $textTheme={{ style: 'body1-medium' }} color={theme.colors.tertiary}> + <StyledText $textTheme={{ style: 'body1-medium' }} color={theme.colors.text.tertiary}> 휴대전화번호로 본인인증하기 </StyledText> diff --git a/src/pages/Profile/ProfileEdit/index.tsx b/src/pages/Profile/ProfileEdit/index.tsx index 60668195..420a59eb 100644 --- a/src/pages/Profile/ProfileEdit/index.tsx +++ b/src/pages/Profile/ProfileEdit/index.tsx @@ -179,42 +179,42 @@ const ProfileEdit: React.FC = () => { - + {nickname || '알수없음'} - + 이름 setName(e.target.value)} /> - + 닉네임 setNickname(e.target.value)} /> - + 소개글 setBio(e.target.value)} /> - + 전화번호 setPhoneNumber(e.target.value)} /> - + 생년월일 setBirthDate(e.target.value)} /> - + 이메일 setEmail(e.target.value)} /> From 04ae98b85725e0997c4503814c9e8c8f68c239ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=80=EB=AF=BC=EC=9E=AC?= Date: Sun, 5 Jan 2025 01:28:50 +0900 Subject: [PATCH 12/27] =?UTF-8?q?Refact:=20eslint-plugin-import=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/auth/index.ts | 1 + src/apis/core/index.ts | 1 + src/apis/matching/index.ts | 1 + src/apis/post-comment/index.ts | 6 +- src/apis/post-like/index.ts | 3 +- src/apis/post-report/dto.ts | 23 +- src/apis/post-report/index.ts | 7 +- src/apis/post/index.ts | 6 +- src/apis/user-block/index.ts | 2 + src/apis/user-report/index.ts | 2 + src/apis/user/index.ts | 2 + src/components/Icons/Alarm.tsx | 1 - src/components/Icons/Heart.tsx | 1 - src/components/Icons/Home.tsx | 1 - src/components/Icons/Like.tsx | 1 - src/components/Icons/Message.tsx | 1 - src/components/Icons/MyPage.tsx | 1 - src/components/Icons/Photo.tsx | 1 - vite-env.d.ts | 22 +- vite.config.ts | 1 + yarn.lock | 952 ++++++++++++++++--------------- 21 files changed, 545 insertions(+), 491 deletions(-) diff --git a/src/apis/auth/index.ts b/src/apis/auth/index.ts index dec241ca..3b46ef5e 100644 --- a/src/apis/auth/index.ts +++ b/src/apis/auth/index.ts @@ -1,4 +1,5 @@ import { newRequest } from '@apis/core'; + import type { getUserInfoByJwtResponse } from './dto'; // jwt로 사용자 정보 조회 api /auth/me diff --git a/src/apis/core/index.ts b/src/apis/core/index.ts index a62602ba..f8705c9e 100644 --- a/src/apis/core/index.ts +++ b/src/apis/core/index.ts @@ -5,6 +5,7 @@ import axios, { AxiosResponse, InternalAxiosRequestConfig, } from 'axios'; + import { NEW_JWT_KEY } from '../../config/constant'; // 기존 서버 응답 타입 diff --git a/src/apis/matching/index.ts b/src/apis/matching/index.ts index 39194b3b..cb0c62ca 100644 --- a/src/apis/matching/index.ts +++ b/src/apis/matching/index.ts @@ -1,4 +1,5 @@ import { newRequest } from '@apis/core'; + import type { CreateMatchingRequest, CreateMatchingResponse, diff --git a/src/apis/post-comment/index.ts b/src/apis/post-comment/index.ts index f130e959..43031182 100644 --- a/src/apis/post-comment/index.ts +++ b/src/apis/post-comment/index.ts @@ -1,7 +1,9 @@ -import { newRequest } from '../core'; -import { CreateCommentRequest, CreateCommentResponse, GetCommentListResponse } from './dto'; import { EmptySuccessResponse } from '../core/dto'; +import { CreateCommentRequest, CreateCommentResponse, GetCommentListResponse } from './dto'; + +import { newRequest } from '../core'; + // 게시글 댓글 생성 API export const createCommentApi = (postId: number, data: CreateCommentRequest) => newRequest.post(`/post-comment?postId=${postId}`, data); diff --git a/src/apis/post-like/index.ts b/src/apis/post-like/index.ts index de332922..a5f3c4cd 100644 --- a/src/apis/post-like/index.ts +++ b/src/apis/post-like/index.ts @@ -1,6 +1,7 @@ -import { newRequest } from '../core'; import { TogglePostLikeStatusResponse, GetPostLikeListResponse } from './dto'; +import { newRequest } from '../core'; + // 게시글 좋아요 누르기/취소 export const togglePostLikeStatusApi = (postId: number) => newRequest.post(`/post-like/${postId}`); diff --git a/src/apis/post-report/dto.ts b/src/apis/post-report/dto.ts index 10c915db..fc7c9ddf 100644 --- a/src/apis/post-report/dto.ts +++ b/src/apis/post-report/dto.ts @@ -1,27 +1,26 @@ import { BaseSuccessResponse } from '../core/dto'; interface BaseReport { - id: number; // 신고 ID - userId: number; // 신고 생성 사용자 ID - postId: number; // 신고된 게시글 ID - content: string; // 신고된 게시글 내용 - repostReason: string; // 신고 사유 + id: number; // 신고 ID + userId: number; // 신고 생성 사용자 ID + postId: number; // 신고된 게시글 ID + content: string; // 신고된 게시글 내용 + repostReason: string; // 신고 사유 } // 게시글 신고 요청 DTO export interface SendPostReportRequest { - requesterId: number; // 신고하는 사용자 ID - postId: number; // 신고 대상 게시글 ID - reason: string; // 신고 사유 + requesterId: number; // 신고하는 사용자 ID + postId: number; // 신고 대상 게시글 ID + reason: string; // 신고 사유 } // 게시물 신고 응답 데이터 export interface SendPostReportData extends BaseReport { - requesterId: number; // 신고하는 사용자 ID - postId: number; // 신고 대상 게시글 ID - reason: string; // 신고 사유 + requesterId: number; // 신고하는 사용자 ID + postId: number; // 신고 대상 게시글 ID + reason: string; // 신고 사유 } // 게시물 신고 응답 타입 export type SendPostReportResponse = BaseSuccessResponse; - diff --git a/src/apis/post-report/index.ts b/src/apis/post-report/index.ts index 29aee5fd..83c361c9 100644 --- a/src/apis/post-report/index.ts +++ b/src/apis/post-report/index.ts @@ -1,6 +1,7 @@ -import { newRequest } from "../core"; -import { SendPostReportRequest, SendPostReportResponse } from "./dto"; +import { SendPostReportRequest, SendPostReportResponse } from './dto'; + +import { newRequest } from '../core'; // 게시글 신고 API export const sendPostReportApi = (data: SendPostReportRequest) => - newRequest.post('/post-report', data); + newRequest.post('/post-report', data); diff --git a/src/apis/post/index.ts b/src/apis/post/index.ts index ad5c2f0f..a6a6b0d9 100644 --- a/src/apis/post/index.ts +++ b/src/apis/post/index.ts @@ -1,4 +1,5 @@ -import { newRequest } from '../core'; +import { EmptySuccessResponse } from '../core/dto'; + import { CreatePostRequest, CreatePostResponse, @@ -8,7 +9,8 @@ import { ModifyPostRequest, ModifyPostResponse, } from './dto'; -import { EmptySuccessResponse } from '../core/dto'; + +import { newRequest } from '../core'; // 게시글 생성 export const createPostApi = (data: CreatePostRequest) => newRequest.post('/post', data); diff --git a/src/apis/user-block/index.ts b/src/apis/user-block/index.ts index 2faee8a2..00443438 100644 --- a/src/apis/user-block/index.ts +++ b/src/apis/user-block/index.ts @@ -1,5 +1,7 @@ import { newRequest } from '@apis/core'; + import type { EmptySuccessResponse } from '@apis/core/dto'; + import type { PostUserBlockRequest } from './dto'; // 유저 차단 api diff --git a/src/apis/user-report/index.ts b/src/apis/user-report/index.ts index 207f70a1..434691dc 100644 --- a/src/apis/user-report/index.ts +++ b/src/apis/user-report/index.ts @@ -1,5 +1,7 @@ import { newRequest } from '@apis/core'; + import type { EmptySuccessResponse } from '@apis/core/dto'; + import type { PostUserReportRequest } from './dto'; // 유저 신고 api diff --git a/src/apis/user/index.ts b/src/apis/user/index.ts index 40c61b9e..06633eb5 100644 --- a/src/apis/user/index.ts +++ b/src/apis/user/index.ts @@ -1,5 +1,7 @@ import { newRequest } from '@apis/core'; + import type { EmptySuccessResponse } from '@apis/core/dto'; + import type { GetUserInfoResponse, PatchUserInfoRequest, diff --git a/src/components/Icons/Alarm.tsx b/src/components/Icons/Alarm.tsx index 52e98d62..ea302bd7 100644 --- a/src/components/Icons/Alarm.tsx +++ b/src/components/Icons/Alarm.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { IconsProps } from './dto'; const Alarm: React.FC = ({ isFilled = false, width = '14', height = '18' }) => { diff --git a/src/components/Icons/Heart.tsx b/src/components/Icons/Heart.tsx index 4fe45fa0..d85645f5 100644 --- a/src/components/Icons/Heart.tsx +++ b/src/components/Icons/Heart.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { IconsProps } from './dto'; const Heart: React.FC = ({ isFilled = false, width = '56', height = '56' }) => { diff --git a/src/components/Icons/Home.tsx b/src/components/Icons/Home.tsx index 05091369..a9419daa 100644 --- a/src/components/Icons/Home.tsx +++ b/src/components/Icons/Home.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { IconsProps } from './dto'; const Home: React.FC = ({ color = '', isFilled = false, width = '14', height = '14' }) => { diff --git a/src/components/Icons/Like.tsx b/src/components/Icons/Like.tsx index 435b3b14..a75d8e75 100644 --- a/src/components/Icons/Like.tsx +++ b/src/components/Icons/Like.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { IconsProps } from './dto'; const Like: React.FC = ({ isFilled = false, color = '', width = '16', height = '14' }) => { diff --git a/src/components/Icons/Message.tsx b/src/components/Icons/Message.tsx index 9b724558..e5a3e61e 100644 --- a/src/components/Icons/Message.tsx +++ b/src/components/Icons/Message.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { IconsProps } from './dto'; const Message: React.FC = ({ color = '', isFilled = false, width = '14', height = '12' }) => { diff --git a/src/components/Icons/MyPage.tsx b/src/components/Icons/MyPage.tsx index 51088e34..cfbeef59 100644 --- a/src/components/Icons/MyPage.tsx +++ b/src/components/Icons/MyPage.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { IconsProps } from './dto'; const MyPage: React.FC = ({ color = '', isFilled = false, width = '16', height = '16' }) => { diff --git a/src/components/Icons/Photo.tsx b/src/components/Icons/Photo.tsx index af92fa55..1a5d2e4a 100644 --- a/src/components/Icons/Photo.tsx +++ b/src/components/Icons/Photo.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { IconsProps } from './dto'; const Photo: React.FC = ({ width = '18', height = '18', color = '#8E8E8E' }) => { diff --git a/vite-env.d.ts b/vite-env.d.ts index 06166d13..3b904507 100644 --- a/vite-env.d.ts +++ b/vite-env.d.ts @@ -1,16 +1,14 @@ /// interface ImportMetaEnv { - VITE_REST_API_KEY: string; - VITE_REDIRECT_URI: string; - VITE_NAVER_CLIENT_ID: string; - VITE_NAVER_CLIENT_SECRET: string; - VITE_GOOGLE_CLIENT_ID: string; - VITE_GOOGLE_CLIENT_SECRET: string; - } - - interface ImportMeta { - readonly env: ImportMetaEnv; - } + VITE_REST_API_KEY: string; + VITE_REDIRECT_URI: string; + VITE_NAVER_CLIENT_ID: string; + VITE_NAVER_CLIENT_SECRET: string; + VITE_GOOGLE_CLIENT_ID: string; + VITE_GOOGLE_CLIENT_SECRET: string; +} - \ No newline at end of file +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/vite.config.ts b/vite.config.ts index 8afff8dd..e5325bdb 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,4 +1,5 @@ import * as path from 'path'; + import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; diff --git a/yarn.lock b/yarn.lock index 350a82a4..e7af7353 100644 --- a/yarn.lock +++ b/yarn.lock @@ -180,125 +180,130 @@ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== -"@esbuild/aix-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" - integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw== - -"@esbuild/android-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0" - integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w== - -"@esbuild/android-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810" - integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew== - -"@esbuild/android-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705" - integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ== - -"@esbuild/darwin-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd" - integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw== - -"@esbuild/darwin-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107" - integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA== - -"@esbuild/freebsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7" - integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA== - -"@esbuild/freebsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93" - integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ== - -"@esbuild/linux-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75" - integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g== - -"@esbuild/linux-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d" - integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw== - -"@esbuild/linux-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb" - integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA== - -"@esbuild/linux-loong64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c" - integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g== - -"@esbuild/linux-mips64el@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3" - integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA== - -"@esbuild/linux-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e" - integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ== - -"@esbuild/linux-riscv64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25" - integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw== - -"@esbuild/linux-s390x@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319" - integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g== - -"@esbuild/linux-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef" - integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA== - -"@esbuild/netbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c" - integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg== - -"@esbuild/openbsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2" - integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg== - -"@esbuild/openbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf" - integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q== - -"@esbuild/sunos-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4" - integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA== - -"@esbuild/win32-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b" - integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA== - -"@esbuild/win32-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103" - integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw== - -"@esbuild/win32-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244" - integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA== +"@esbuild/aix-ppc64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz#38848d3e25afe842a7943643cbcd387cc6e13461" + integrity sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA== + +"@esbuild/android-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz#f592957ae8b5643129fa889c79e69cd8669bb894" + integrity sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg== + +"@esbuild/android-arm@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz#72d8a2063aa630308af486a7e5cbcd1e134335b3" + integrity sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q== + +"@esbuild/android-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz#9a7713504d5f04792f33be9c197a882b2d88febb" + integrity sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw== + +"@esbuild/darwin-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz#02ae04ad8ebffd6e2ea096181b3366816b2b5936" + integrity sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA== + +"@esbuild/darwin-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz#9ec312bc29c60e1b6cecadc82bd504d8adaa19e9" + integrity sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA== + +"@esbuild/freebsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz#5e82f44cb4906d6aebf24497d6a068cfc152fa00" + integrity sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg== + +"@esbuild/freebsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz#3fb1ce92f276168b75074b4e51aa0d8141ecce7f" + integrity sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q== + +"@esbuild/linux-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz#856b632d79eb80aec0864381efd29de8fd0b1f43" + integrity sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg== + +"@esbuild/linux-arm@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz#c846b4694dc5a75d1444f52257ccc5659021b736" + integrity sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA== + +"@esbuild/linux-ia32@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz#f8a16615a78826ccbb6566fab9a9606cfd4a37d5" + integrity sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw== + +"@esbuild/linux-loong64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz#1c451538c765bf14913512c76ed8a351e18b09fc" + integrity sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ== + +"@esbuild/linux-mips64el@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz#0846edeefbc3d8d50645c51869cc64401d9239cb" + integrity sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw== + +"@esbuild/linux-ppc64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz#8e3fc54505671d193337a36dfd4c1a23b8a41412" + integrity sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw== + +"@esbuild/linux-riscv64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz#6a1e92096d5e68f7bb10a0d64bb5b6d1daf9a694" + integrity sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q== + +"@esbuild/linux-s390x@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz#ab18e56e66f7a3c49cb97d337cd0a6fea28a8577" + integrity sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw== + +"@esbuild/linux-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" + integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== + +"@esbuild/netbsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz#65f19161432bafb3981f5f20a7ff45abb2e708e6" + integrity sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw== + +"@esbuild/netbsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz#7a3a97d77abfd11765a72f1c6f9b18f5396bcc40" + integrity sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw== + +"@esbuild/openbsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz#58b00238dd8f123bfff68d3acc53a6ee369af89f" + integrity sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A== + +"@esbuild/openbsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz#0ac843fda0feb85a93e288842936c21a00a8a205" + integrity sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA== + +"@esbuild/sunos-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz#8b7aa895e07828d36c422a4404cc2ecf27fb15c6" + integrity sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig== + +"@esbuild/win32-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz#c023afb647cabf0c3ed13f0eddfc4f1d61c66a85" + integrity sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ== + +"@esbuild/win32-ia32@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz#96c356132d2dda990098c8b8b951209c3cd743c2" + integrity sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA== + +"@esbuild/win32-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz#34aa0b52d0fbb1a654b596acfa595f0c7b77a77b" + integrity sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.1" @@ -885,100 +890,100 @@ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.21.0.tgz#c65ae4262bdcfe415dbd4f64ec87676e4a56e2b5" integrity sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA== -"@rollup/rollup-android-arm-eabi@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz#7f4c4d8cd5ccab6e95d6750dbe00321c1f30791e" - integrity sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ== - -"@rollup/rollup-android-arm64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz#17ea71695fb1518c2c324badbe431a0bd1879f2d" - integrity sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA== - -"@rollup/rollup-darwin-arm64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz#dac0f0d0cfa73e7d5225ae6d303c13c8979e7999" - integrity sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ== - -"@rollup/rollup-darwin-x64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz#8f63baa1d31784904a380d2e293fa1ddf53dd4a2" - integrity sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ== - -"@rollup/rollup-freebsd-arm64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz#30ed247e0df6e8858cdc6ae4090e12dbeb8ce946" - integrity sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA== - -"@rollup/rollup-freebsd-x64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz#57846f382fddbb508412ae07855b8a04c8f56282" - integrity sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ== - -"@rollup/rollup-linux-arm-gnueabihf@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz#378ca666c9dae5e6f94d1d351e7497c176e9b6df" - integrity sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA== - -"@rollup/rollup-linux-arm-musleabihf@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz#a692eff3bab330d5c33a5d5813a090c15374cddb" - integrity sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg== - -"@rollup/rollup-linux-arm64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz#6b1719b76088da5ac1ae1feccf48c5926b9e3db9" - integrity sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA== - -"@rollup/rollup-linux-arm64-musl@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz#865baf5b6f5ff67acb32e5a359508828e8dc5788" - integrity sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A== - -"@rollup/rollup-linux-loongarch64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz#23c6609ba0f7fa7a7f2038b6b6a08555a5055a87" - integrity sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA== - -"@rollup/rollup-linux-powerpc64le-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz#652ef0d9334a9f25b9daf85731242801cb0fc41c" - integrity sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A== - -"@rollup/rollup-linux-riscv64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz#1eb6651839ee6ebca64d6cc64febbd299e95e6bd" - integrity sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA== - -"@rollup/rollup-linux-s390x-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz#015c52293afb3ff2a293cf0936b1d43975c1e9cd" - integrity sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg== - -"@rollup/rollup-linux-x64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz#b83001b5abed2bcb5e2dbeec6a7e69b194235c1e" - integrity sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw== - -"@rollup/rollup-linux-x64-musl@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz#6cc7c84cd4563737f8593e66f33b57d8e228805b" - integrity sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g== - -"@rollup/rollup-win32-arm64-msvc@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz#631ffeee094d71279fcd1fe8072bdcf25311bc11" - integrity sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A== - -"@rollup/rollup-win32-ia32-msvc@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz#06d1d60d5b9f718e8a6c4a43f82e3f9e3254587f" - integrity sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA== - -"@rollup/rollup-win32-x64-msvc@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz#4dff5c4259ebe6c5b4a8f2c5bc3829b7a8447ff0" - integrity sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA== +"@rollup/rollup-android-arm-eabi@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz#9bd38df6a29afb7f0336d988bc8112af0c8816c0" + integrity sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw== + +"@rollup/rollup-android-arm64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz#bd1a98390e15b76eeef907175a37c5f0f9e4d214" + integrity sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew== + +"@rollup/rollup-darwin-arm64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz#bc6fa8a2cc77b5f367424e5e994e3537524e6879" + integrity sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw== + +"@rollup/rollup-darwin-x64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz#76059c91f06b17406347b127df10f065283b2e61" + integrity sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng== + +"@rollup/rollup-freebsd-arm64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz#83178315c0be4b4c8c1fd835e1952d2dc1eb4e6e" + integrity sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw== + +"@rollup/rollup-freebsd-x64@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz#1ef24fa0576bf7899a0a0a649156606dbd7a0d46" + integrity sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w== + +"@rollup/rollup-linux-arm-gnueabihf@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz#443a6f5681bf4611caae42988994a6d8ee676216" + integrity sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A== + +"@rollup/rollup-linux-arm-musleabihf@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz#9738b27184102228637a683e5f35b22ea352394f" + integrity sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ== + +"@rollup/rollup-linux-arm64-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz#b5e9d5e30ff36a19bedd29c715ba18a1889ff269" + integrity sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA== + +"@rollup/rollup-linux-arm64-musl@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz#1d8f68f0829b57f746ec03432ad046f1af014a98" + integrity sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA== + +"@rollup/rollup-linux-loongarch64-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz#07027feb883408e74a3002c8e50caaedd288ae38" + integrity sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz#544ce1b0847a9c1240425e86f33daceac7ec4e12" + integrity sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w== + +"@rollup/rollup-linux-riscv64-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz#64be13d51852ec1e2dfbd25d997ed5f42f35ea6d" + integrity sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ== + +"@rollup/rollup-linux-s390x-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz#31f51e1e05c6264552d03875d9e2e673f0fd86e3" + integrity sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g== + +"@rollup/rollup-linux-x64-gnu@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz#f4c95b26f4ad69ebdb64b42f0ae4da2a0f617958" + integrity sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ== + +"@rollup/rollup-linux-x64-musl@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz#ab7be89192f72beb9ea6e2386186fefde4f69d82" + integrity sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA== + +"@rollup/rollup-win32-arm64-msvc@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz#7f12efb8240b238346951559998802722944421e" + integrity sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig== + +"@rollup/rollup-win32-ia32-msvc@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz#353d14d6eee943004d129796e4feddd3aa260921" + integrity sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng== + +"@rollup/rollup-win32-x64-msvc@4.29.1": + version "4.29.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz#c82f04a09ba481e13857d6f2516e072aaa51b7f4" + integrity sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg== "@rtsao/scc@^1.1.0": version "1.1.0" @@ -1047,16 +1052,16 @@ integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg== "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "22.10.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9" - integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== + version "22.10.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.5.tgz#95af89a3fb74a2bb41ef9927f206e6472026e48b" + integrity sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ== dependencies: undici-types "~6.20.0" "@types/node@^20.14.10": - version "20.17.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.10.tgz#3f7166190aece19a0d1d364d75c8b0b5778c1e18" - integrity sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA== + version "20.17.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.11.tgz#2c05215fc37316b1596df7fbdba52151eaf83c50" + integrity sha512-Ept5glCK35R8yeyIeYlRIZtX6SLRyqMhOFTgj5SOkMpLTdw3SEHI9fHx60xaUZ+V1aJxQJODE+7/j5ocZydYTg== dependencies: undici-types "~6.19.2" @@ -1071,16 +1076,16 @@ integrity sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q== "@types/react@*": - version "19.0.1" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.1.tgz#a000d5b78f473732a08cecbead0f3751e550b3df" - integrity sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ== + version "19.0.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.2.tgz#9363e6b3ef898c471cb182dd269decc4afc1b4f6" + integrity sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg== dependencies: csstype "^3.0.2" "@types/react@^18.3.3": - version "18.3.17" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.17.tgz#d86ca0e081c7a5e979b7db175f9515a41038cea7" - integrity sha512-opAQ5no6LqJNo9TqnxBKsgnkIYHozW9KSTlFVoSUJYh1Fl/sswkEoqIugRSm7tbh6pABtYjGAjW+GOS23j8qbw== + version "18.3.18" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.18.tgz#9b382c4cd32e13e463f97df07c2ee3bbcd26904b" + integrity sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -1100,61 +1105,61 @@ integrity sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw== "@typescript-eslint/eslint-plugin@^8.18.1": - version "8.18.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz#992e5ac1553ce20d0d46aa6eccd79dc36dedc805" - integrity sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ== + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.0.tgz#2b1e1b791e21d5fc27ddc93884db066444f597b5" + integrity sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.18.1" - "@typescript-eslint/type-utils" "8.18.1" - "@typescript-eslint/utils" "8.18.1" - "@typescript-eslint/visitor-keys" "8.18.1" + "@typescript-eslint/scope-manager" "8.19.0" + "@typescript-eslint/type-utils" "8.19.0" + "@typescript-eslint/utils" "8.19.0" + "@typescript-eslint/visitor-keys" "8.19.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" "@typescript-eslint/parser@^8.18.1": - version "8.18.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.18.1.tgz#c258bae062778b7696793bc492249027a39dfb95" - integrity sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA== - dependencies: - "@typescript-eslint/scope-manager" "8.18.1" - "@typescript-eslint/types" "8.18.1" - "@typescript-eslint/typescript-estree" "8.18.1" - "@typescript-eslint/visitor-keys" "8.18.1" + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.19.0.tgz#f1512e6e5c491b03aabb2718b95becde22b15292" + integrity sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw== + dependencies: + "@typescript-eslint/scope-manager" "8.19.0" + "@typescript-eslint/types" "8.19.0" + "@typescript-eslint/typescript-estree" "8.19.0" + "@typescript-eslint/visitor-keys" "8.19.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.18.1": - version "8.18.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz#52cedc3a8178d7464a70beffed3203678648e55b" - integrity sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ== +"@typescript-eslint/scope-manager@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.19.0.tgz#28fa413a334f70e8b506a968531e0a7c9c3076dc" + integrity sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA== dependencies: - "@typescript-eslint/types" "8.18.1" - "@typescript-eslint/visitor-keys" "8.18.1" + "@typescript-eslint/types" "8.19.0" + "@typescript-eslint/visitor-keys" "8.19.0" -"@typescript-eslint/type-utils@8.18.1": - version "8.18.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz#10f41285475c0bdee452b79ff7223f0e43a7781e" - integrity sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ== +"@typescript-eslint/type-utils@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.19.0.tgz#41abd7d2e4cf93b6854b1fe6cbf416fab5abf89f" + integrity sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg== dependencies: - "@typescript-eslint/typescript-estree" "8.18.1" - "@typescript-eslint/utils" "8.18.1" + "@typescript-eslint/typescript-estree" "8.19.0" + "@typescript-eslint/utils" "8.19.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@8.18.1": - version "8.18.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.18.1.tgz#d7f4f94d0bba9ebd088de840266fcd45408a8fff" - integrity sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw== +"@typescript-eslint/types@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.19.0.tgz#a190a25c5484a42b81eaad06989579fdeb478cbb" + integrity sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA== -"@typescript-eslint/typescript-estree@8.18.1": - version "8.18.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz#2a86cd64b211a742f78dfa7e6f4860413475367e" - integrity sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg== +"@typescript-eslint/typescript-estree@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz#6b4f48f98ffad6597379951b115710f4d68c9ccb" + integrity sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw== dependencies: - "@typescript-eslint/types" "8.18.1" - "@typescript-eslint/visitor-keys" "8.18.1" + "@typescript-eslint/types" "8.19.0" + "@typescript-eslint/visitor-keys" "8.19.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -1162,22 +1167,22 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.18.1": - version "8.18.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.18.1.tgz#c4199ea23fc823c736e2c96fd07b1f7235fa92d5" - integrity sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ== +"@typescript-eslint/utils@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.19.0.tgz#33824310e1fccc17f27fbd1030fd8bbd9a674684" + integrity sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.18.1" - "@typescript-eslint/types" "8.18.1" - "@typescript-eslint/typescript-estree" "8.18.1" + "@typescript-eslint/scope-manager" "8.19.0" + "@typescript-eslint/types" "8.19.0" + "@typescript-eslint/typescript-estree" "8.19.0" -"@typescript-eslint/visitor-keys@8.18.1": - version "8.18.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz#344b4f6bc83f104f514676facf3129260df7610a" - integrity sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ== +"@typescript-eslint/visitor-keys@8.19.0": + version "8.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz#dc313f735e64c4979c9073f51ffcefb6d9be5c77" + integrity sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w== dependencies: - "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/types" "8.19.0" eslint-visitor-keys "^4.2.0" "@ungap/structured-clone@^1.2.0": @@ -1233,13 +1238,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" + call-bound "^1.0.3" + is-array-buffer "^3.0.5" array-includes@^3.1.8: version "3.1.8" @@ -1364,7 +1369,7 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: es-errors "^1.3.0" function-bind "^1.1.2" -call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@^1.0.8: +call-bind@^1.0.7, call-bind@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== @@ -1393,9 +1398,9 @@ camelize@^1.0.0: integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== caniuse-lite@^1.0.30001688: - version "1.0.30001689" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz#67ca960dd5f443903e19949aeacc9d28f6e10910" - integrity sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g== + version "1.0.30001690" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" + integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== chalk@^4.0.0: version "4.1.2" @@ -1476,25 +1481,25 @@ csstype@3.1.3, csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== dependencies: - call-bind "^1.0.6" + call-bound "^1.0.3" es-errors "^1.3.0" - is-data-view "^1.0.1" + is-data-view "^1.0.2" -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== dependencies: - call-bind "^1.0.7" + call-bound "^1.0.3" es-errors "^1.3.0" - is-data-view "^1.0.1" + is-data-view "^1.0.2" -data-view-byte-offset@^1.0.0: +data-view-byte-offset@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== @@ -1581,9 +1586,9 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1: gopd "^1.2.0" electron-to-chromium@^1.5.73: - version "1.5.74" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz#cb886b504a6467e4c00bea3317edb38393c53413" - integrity sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw== + version "1.5.76" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz#db20295c5061b68f07c8ea4dfcbd701485d94a3d" + integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ== emoji-regex@^8.0.0: version "8.0.0" @@ -1607,34 +1612,35 @@ engine.io-parser@~5.2.1: integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== enhanced-resolve@^5.15.0: - version "5.17.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" - integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== + version "5.18.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz#91eb1db193896b9801251eeff1c6980278b1e404" + integrity sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.6: - version "1.23.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.6.tgz#55f0e1ce7128995cc04ace0a57d7dca348345108" - integrity sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA== +es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9: + version "1.23.9" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606" + integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== dependencies: - array-buffer-byte-length "^1.0.1" + array-buffer-byte-length "^1.0.2" arraybuffer.prototype.slice "^1.0.4" available-typed-arrays "^1.0.7" call-bind "^1.0.8" call-bound "^1.0.3" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" es-define-property "^1.0.1" es-errors "^1.3.0" es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" + es-set-tostringtag "^2.1.0" es-to-primitive "^1.3.0" - function.prototype.name "^1.1.7" - get-intrinsic "^1.2.6" - get-symbol-description "^1.0.2" + function.prototype.name "^1.1.8" + get-intrinsic "^1.2.7" + get-proto "^1.0.0" + get-symbol-description "^1.1.0" globalthis "^1.0.4" gopd "^1.2.0" has-property-descriptors "^1.0.2" @@ -1642,31 +1648,33 @@ es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.6: has-symbols "^1.1.0" hasown "^2.0.2" internal-slot "^1.1.0" - is-array-buffer "^3.0.4" + is-array-buffer "^3.0.5" is-callable "^1.2.7" is-data-view "^1.0.2" - is-negative-zero "^2.0.3" is-regex "^1.2.1" - is-shared-array-buffer "^1.0.3" + is-shared-array-buffer "^1.0.4" is-string "^1.1.1" - is-typed-array "^1.1.13" + is-typed-array "^1.1.15" is-weakref "^1.1.0" - math-intrinsics "^1.0.0" + math-intrinsics "^1.1.0" object-inspect "^1.13.3" object-keys "^1.1.1" - object.assign "^4.1.5" + object.assign "^4.1.7" + own-keys "^1.0.1" regexp.prototype.flags "^1.5.3" safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" safe-regex-test "^1.1.0" + set-proto "^1.0.0" string.prototype.trim "^1.2.10" string.prototype.trimend "^1.0.9" string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.3" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" typed-array-length "^1.0.7" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.16" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.18" es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" @@ -1685,14 +1693,15 @@ es-object-atoms@^1.0.0: dependencies: es-errors "^1.3.0" -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: - get-intrinsic "^1.2.4" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" has-tostringtag "^1.0.2" - hasown "^2.0.1" + hasown "^2.0.2" es-shim-unscopables@^1.0.2: version "1.0.2" @@ -1710,35 +1719,36 @@ es-to-primitive@^1.3.0: is-date-object "^1.0.5" is-symbol "^1.0.4" -esbuild@^0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7" - integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ== +esbuild@^0.24.2: + version "0.24.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" + integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== optionalDependencies: - "@esbuild/aix-ppc64" "0.24.0" - "@esbuild/android-arm" "0.24.0" - "@esbuild/android-arm64" "0.24.0" - "@esbuild/android-x64" "0.24.0" - "@esbuild/darwin-arm64" "0.24.0" - "@esbuild/darwin-x64" "0.24.0" - "@esbuild/freebsd-arm64" "0.24.0" - "@esbuild/freebsd-x64" "0.24.0" - "@esbuild/linux-arm" "0.24.0" - "@esbuild/linux-arm64" "0.24.0" - "@esbuild/linux-ia32" "0.24.0" - "@esbuild/linux-loong64" "0.24.0" - "@esbuild/linux-mips64el" "0.24.0" - "@esbuild/linux-ppc64" "0.24.0" - "@esbuild/linux-riscv64" "0.24.0" - "@esbuild/linux-s390x" "0.24.0" - "@esbuild/linux-x64" "0.24.0" - "@esbuild/netbsd-x64" "0.24.0" - "@esbuild/openbsd-arm64" "0.24.0" - "@esbuild/openbsd-x64" "0.24.0" - "@esbuild/sunos-x64" "0.24.0" - "@esbuild/win32-arm64" "0.24.0" - "@esbuild/win32-ia32" "0.24.0" - "@esbuild/win32-x64" "0.24.0" + "@esbuild/aix-ppc64" "0.24.2" + "@esbuild/android-arm" "0.24.2" + "@esbuild/android-arm64" "0.24.2" + "@esbuild/android-x64" "0.24.2" + "@esbuild/darwin-arm64" "0.24.2" + "@esbuild/darwin-x64" "0.24.2" + "@esbuild/freebsd-arm64" "0.24.2" + "@esbuild/freebsd-x64" "0.24.2" + "@esbuild/linux-arm" "0.24.2" + "@esbuild/linux-arm64" "0.24.2" + "@esbuild/linux-ia32" "0.24.2" + "@esbuild/linux-loong64" "0.24.2" + "@esbuild/linux-mips64el" "0.24.2" + "@esbuild/linux-ppc64" "0.24.2" + "@esbuild/linux-riscv64" "0.24.2" + "@esbuild/linux-s390x" "0.24.2" + "@esbuild/linux-x64" "0.24.2" + "@esbuild/netbsd-arm64" "0.24.2" + "@esbuild/netbsd-x64" "0.24.2" + "@esbuild/openbsd-arm64" "0.24.2" + "@esbuild/openbsd-x64" "0.24.2" + "@esbuild/sunos-x64" "0.24.2" + "@esbuild/win32-arm64" "0.24.2" + "@esbuild/win32-ia32" "0.24.2" + "@esbuild/win32-x64" "0.24.2" escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" @@ -1955,9 +1965,9 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + version "1.18.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" + integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== dependencies: reusify "^1.0.4" @@ -2074,12 +2084,13 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.6, function.prototype.name@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.7.tgz#9df48ea5f746bf577d7e15b5da89df8952a98e7b" - integrity sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA== +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: call-bind "^1.0.8" + call-bound "^1.0.3" define-properties "^1.2.1" functions-have-names "^1.2.3" hasown "^2.0.2" @@ -2100,23 +2111,31 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" - integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.7.tgz#dcfcb33d3272e15f445d15124bc0a216189b9044" + integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA== dependencies: call-bind-apply-helpers "^1.0.1" - dunder-proto "^1.0.0" es-define-property "^1.0.1" es-errors "^1.3.0" es-object-atoms "^1.0.0" function-bind "^1.1.2" + get-proto "^1.0.0" gopd "^1.2.0" has-symbols "^1.1.0" hasown "^2.0.2" - math-intrinsics "^1.0.0" + math-intrinsics "^1.1.0" -get-symbol-description@^1.0.2: +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-symbol-description@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== @@ -2227,14 +2246,14 @@ has-symbols@^1.0.3, has-symbols@^1.1.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: +has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: +hasown@^2.0.0, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -2308,7 +2327,7 @@ internal-slot@^1.1.0: hasown "^2.0.2" side-channel "^1.1.0" -is-array-buffer@^3.0.4: +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== @@ -2318,11 +2337,14 @@ is-array-buffer@^3.0.4: get-intrinsic "^1.2.6" is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.0.tgz#1d1080612c493608e93168fc4458c245074c06a6" + integrity sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" is-bigint@^1.1.0: version "1.1.0" @@ -2352,9 +2374,9 @@ is-callable@^1.1.3, is-callable@^1.2.7: integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.0.tgz#6c01ffdd5e33c49c1d2abfa93334a85cb56bd81c" - integrity sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g== + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: hasown "^2.0.2" @@ -2393,11 +2415,14 @@ is-fullwidth-code-point@^3.0.0: integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" @@ -2411,11 +2436,6 @@ is-map@^2.0.3: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - is-number-object@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" @@ -2449,7 +2469,7 @@ is-set@^2.0.3: resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== -is-shared-array-buffer@^1.0.3: +is-shared-array-buffer@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== @@ -2617,7 +2637,7 @@ matchmediaquery@^0.4.2: dependencies: css-mediaquery "^0.1.2" -math-intrinsics@^1.0.0: +math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== @@ -2701,7 +2721,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.5: +object.assign@^4.1.7: version "4.1.7" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== @@ -2761,6 +2781,15 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -2928,17 +2957,17 @@ react-responsive@^10.0.0: shallow-equal "^3.1.0" react-router-dom@^6.24.1: - version "6.28.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.28.0.tgz#f73ebb3490e59ac9f299377062ad1d10a9f579e6" - integrity sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg== + version "6.28.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.28.1.tgz#b78fe452d2cd31919b80e57047a896bfa1509f8c" + integrity sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ== dependencies: "@remix-run/router" "1.21.0" - react-router "6.28.0" + react-router "6.28.1" -react-router@6.28.0: - version "6.28.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.28.0.tgz#29247c86d7ba901d7e5a13aa79a96723c3e59d0d" - integrity sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg== +react-router@6.28.1: + version "6.28.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.28.1.tgz#f82317ab24eee67d7beb7b304c0378b2b48fa178" + integrity sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA== dependencies: "@remix-run/router" "1.21.0" @@ -2962,27 +2991,29 @@ recoil@^0.7.7: hamt_plus "1.0.2" reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz#c905f3386008de95a62315f3ea8630404be19e2f" - integrity sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q== + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== dependencies: call-bind "^1.0.8" define-properties "^1.2.1" - dunder-proto "^1.0.1" - es-abstract "^1.23.6" + es-abstract "^1.23.9" es-errors "^1.3.0" - get-intrinsic "^1.2.6" - gopd "^1.2.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" which-builtin-type "^1.2.1" regexp.prototype.flags@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" - integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" define-properties "^1.2.1" es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" set-function-name "^2.0.2" require-directory@^2.1.1: @@ -3001,9 +3032,9 @@ resolve-pkg-maps@^1.0.0: integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve@^1.22.4: - version "1.22.9" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.9.tgz#6da76e4cdc57181fa4471231400e8851d0a924f3" - integrity sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A== + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: is-core-module "^2.16.0" path-parse "^1.0.7" @@ -3022,31 +3053,31 @@ rimraf@^3.0.2: glob "^7.1.3" rollup@^4.23.0: - version "4.28.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.28.1.tgz#7718ba34d62b449dfc49adbfd2f312b4fe0df4de" - integrity sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg== + version "4.29.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.29.1.tgz#a9aaaece817e5f778489e5bf82e379cc8a5c05bc" + integrity sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw== dependencies: "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.28.1" - "@rollup/rollup-android-arm64" "4.28.1" - "@rollup/rollup-darwin-arm64" "4.28.1" - "@rollup/rollup-darwin-x64" "4.28.1" - "@rollup/rollup-freebsd-arm64" "4.28.1" - "@rollup/rollup-freebsd-x64" "4.28.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.28.1" - "@rollup/rollup-linux-arm-musleabihf" "4.28.1" - "@rollup/rollup-linux-arm64-gnu" "4.28.1" - "@rollup/rollup-linux-arm64-musl" "4.28.1" - "@rollup/rollup-linux-loongarch64-gnu" "4.28.1" - "@rollup/rollup-linux-powerpc64le-gnu" "4.28.1" - "@rollup/rollup-linux-riscv64-gnu" "4.28.1" - "@rollup/rollup-linux-s390x-gnu" "4.28.1" - "@rollup/rollup-linux-x64-gnu" "4.28.1" - "@rollup/rollup-linux-x64-musl" "4.28.1" - "@rollup/rollup-win32-arm64-msvc" "4.28.1" - "@rollup/rollup-win32-ia32-msvc" "4.28.1" - "@rollup/rollup-win32-x64-msvc" "4.28.1" + "@rollup/rollup-android-arm-eabi" "4.29.1" + "@rollup/rollup-android-arm64" "4.29.1" + "@rollup/rollup-darwin-arm64" "4.29.1" + "@rollup/rollup-darwin-x64" "4.29.1" + "@rollup/rollup-freebsd-arm64" "4.29.1" + "@rollup/rollup-freebsd-x64" "4.29.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.29.1" + "@rollup/rollup-linux-arm-musleabihf" "4.29.1" + "@rollup/rollup-linux-arm64-gnu" "4.29.1" + "@rollup/rollup-linux-arm64-musl" "4.29.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.29.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.29.1" + "@rollup/rollup-linux-riscv64-gnu" "4.29.1" + "@rollup/rollup-linux-s390x-gnu" "4.29.1" + "@rollup/rollup-linux-x64-gnu" "4.29.1" + "@rollup/rollup-linux-x64-musl" "4.29.1" + "@rollup/rollup-win32-arm64-msvc" "4.29.1" + "@rollup/rollup-win32-ia32-msvc" "4.29.1" + "@rollup/rollup-win32-x64-msvc" "4.29.1" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -3072,6 +3103,14 @@ safe-buffer@>=5.1.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + safe-regex-test@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" @@ -3120,6 +3159,15 @@ set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + shallow-equal@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-3.1.0.tgz#e7a54bac629c7f248eff6c2f5b63122ba4320bec" @@ -3306,9 +3354,9 @@ supports-preserve-symlinks-flag@^1.0.0: integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== swiper@^11.1.8: - version "11.1.15" - resolved "https://registry.yarnpkg.com/swiper/-/swiper-11.1.15.tgz#e2258c8d38282e2f115ca463d6e8c5b84cdcf1ca" - integrity sha512-IzWeU34WwC7gbhjKsjkImTuCRf+lRbO6cnxMGs88iVNKDwV+xQpBCJxZ4bNH6gSrIbbyVJ1kuGzo3JTtz//CBw== + version "11.2.0" + resolved "https://registry.yarnpkg.com/swiper/-/swiper-11.2.0.tgz#fbef83ab8fe165ceff82c69177a57033809cb1c2" + integrity sha512-rjjAKgDEs+grR2eQshVDCcE4KNPC7CI294nfcbV9gE8WCsLdvOYXDeZKUYevqAZZp8j5hE7kpT3dAGVKFBWlxQ== synckit@^0.9.1: version "0.9.2" @@ -3372,7 +3420,7 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -typed-array-buffer@^1.0.2: +typed-array-buffer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== @@ -3381,7 +3429,7 @@ typed-array-buffer@^1.0.2: es-errors "^1.3.0" is-typed-array "^1.1.14" -typed-array-byte-length@^1.0.1: +typed-array-byte-length@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== @@ -3392,7 +3440,7 @@ typed-array-byte-length@^1.0.1: has-proto "^1.2.0" is-typed-array "^1.1.14" -typed-array-byte-offset@^1.0.3: +typed-array-byte-offset@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== @@ -3422,7 +3470,7 @@ typescript@^5.7.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== -unbox-primitive@^1.0.2: +unbox-primitive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== @@ -3463,11 +3511,11 @@ uri-js@^4.2.2: punycode "^2.1.0" vite@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.3.tgz#cc01f403e326a9fc1e064235df8a6de084c8a491" - integrity sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw== + version "6.0.7" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.7.tgz#f0f8c120733b04af52b4a1e3e7cb54eb851a799b" + integrity sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ== dependencies: - esbuild "^0.24.0" + esbuild "^0.24.2" postcss "^8.4.49" rollup "^4.23.0" optionalDependencies: @@ -3527,7 +3575,7 @@ which-collection@^1.0.2: is-weakmap "^2.0.2" is-weakset "^2.0.3" -which-typed-array@^1.1.16: +which-typed-array@^1.1.16, which-typed-array@^1.1.18: version "1.1.18" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.18.tgz#df2389ebf3fbb246a71390e90730a9edb6ce17ad" integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA== From 8106a5b54c41ef1ab64323f40860c1453df28e22 Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 17:11:38 +0900 Subject: [PATCH 13/27] =?UTF-8?q?Fix:=20apis=20=EB=A6=B0=ED=8A=B8=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/chatting/dto.ts | 2 +- src/apis/post-comment/dto.ts | 2 +- src/apis/post-comment/index.ts | 6 +++--- src/apis/post-like/dto.ts | 4 ++-- src/apis/post-like/index.ts | 4 ++-- src/apis/post-report/dto.ts | 2 +- src/apis/post-report/index.ts | 4 ++-- src/apis/post/dto.ts | 6 +++--- src/apis/post/index.ts | 8 ++++---- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/apis/chatting/dto.ts b/src/apis/chatting/dto.ts index ee2dc1e8..2d317a07 100644 --- a/src/apis/chatting/dto.ts +++ b/src/apis/chatting/dto.ts @@ -27,7 +27,7 @@ export interface chatRoomMessagesData { fromUser: FromUserDto; toUser: ToUserDto; createdAt: string; - toUserReadAt: any; + toUserReadAt: Date; } export interface FromUserDto { diff --git a/src/apis/post-comment/dto.ts b/src/apis/post-comment/dto.ts index ce25c48d..d0a9fe02 100644 --- a/src/apis/post-comment/dto.ts +++ b/src/apis/post-comment/dto.ts @@ -17,7 +17,7 @@ interface Content { content: string; } -interface CreateCommentData extends Content {} +type CreateCommentData = Content; export interface Comment { id: number; diff --git a/src/apis/post-comment/index.ts b/src/apis/post-comment/index.ts index 43031182..b6471270 100644 --- a/src/apis/post-comment/index.ts +++ b/src/apis/post-comment/index.ts @@ -1,8 +1,8 @@ -import { EmptySuccessResponse } from '../core/dto'; +import { newRequest } from '@apis/core'; -import { CreateCommentRequest, CreateCommentResponse, GetCommentListResponse } from './dto'; +import type { EmptySuccessResponse } from '@apis/core/dto'; -import { newRequest } from '../core'; +import type { CreateCommentRequest, CreateCommentResponse, GetCommentListResponse } from './dto'; // 게시글 댓글 생성 API export const createCommentApi = (postId: number, data: CreateCommentRequest) => diff --git a/src/apis/post-like/dto.ts b/src/apis/post-like/dto.ts index 299bf209..c1f8f05e 100644 --- a/src/apis/post-like/dto.ts +++ b/src/apis/post-like/dto.ts @@ -1,5 +1,5 @@ -import { BaseSuccessResponse } from '../core/dto'; -import { PaginationMeta } from '../util/dto'; +import type { BaseSuccessResponse } from '@apis/core/dto'; +import type { PaginationMeta } from '@apis/util/dto'; // 좋아요 누르기/취소 export type TogglePostLikeStatusResponse = BaseSuccessResponse; diff --git a/src/apis/post-like/index.ts b/src/apis/post-like/index.ts index a5f3c4cd..aab0eec2 100644 --- a/src/apis/post-like/index.ts +++ b/src/apis/post-like/index.ts @@ -1,6 +1,6 @@ -import { TogglePostLikeStatusResponse, GetPostLikeListResponse } from './dto'; +import { newRequest } from '@apis/core'; -import { newRequest } from '../core'; +import type { TogglePostLikeStatusResponse, GetPostLikeListResponse } from './dto'; // 게시글 좋아요 누르기/취소 export const togglePostLikeStatusApi = (postId: number) => diff --git a/src/apis/post-report/dto.ts b/src/apis/post-report/dto.ts index fc7c9ddf..0d5491cc 100644 --- a/src/apis/post-report/dto.ts +++ b/src/apis/post-report/dto.ts @@ -1,4 +1,4 @@ -import { BaseSuccessResponse } from '../core/dto'; +import type { BaseSuccessResponse } from '@apis/core/dto'; interface BaseReport { id: number; // 신고 ID diff --git a/src/apis/post-report/index.ts b/src/apis/post-report/index.ts index 83c361c9..27bb70a1 100644 --- a/src/apis/post-report/index.ts +++ b/src/apis/post-report/index.ts @@ -1,6 +1,6 @@ -import { SendPostReportRequest, SendPostReportResponse } from './dto'; +import { newRequest } from '@apis/core'; -import { newRequest } from '../core'; +import type { SendPostReportRequest, SendPostReportResponse } from './dto'; // 게시글 신고 API export const sendPostReportApi = (data: SendPostReportRequest) => diff --git a/src/apis/post/dto.ts b/src/apis/post/dto.ts index d3d86a9f..f1b98627 100644 --- a/src/apis/post/dto.ts +++ b/src/apis/post/dto.ts @@ -1,5 +1,5 @@ -import { BaseSuccessResponse } from '../core/dto'; -import { PaginationMeta } from '../util/dto'; +import type { BaseSuccessResponse } from '@apis/core/dto'; +import type { PaginationMeta } from '@apis/util/dto'; // 게시글 생성 //request @@ -28,7 +28,7 @@ export interface PostBase { postClothings?: PostClothing[] | null; isRepresentative: boolean; } -export interface CreatePostData extends PostBase {} +export type CreatePostData = PostBase; export interface PostSummary { id: number; content: string; diff --git a/src/apis/post/index.ts b/src/apis/post/index.ts index a6a6b0d9..18614464 100644 --- a/src/apis/post/index.ts +++ b/src/apis/post/index.ts @@ -1,6 +1,8 @@ -import { EmptySuccessResponse } from '../core/dto'; +import { newRequest } from '@apis/core'; -import { +import type { EmptySuccessResponse } from '@apis/core/dto'; + +import type { CreatePostRequest, CreatePostResponse, GetPostListResponse, @@ -10,8 +12,6 @@ import { ModifyPostResponse, } from './dto'; -import { newRequest } from '../core'; - // 게시글 생성 export const createPostApi = (data: CreatePostRequest) => newRequest.post('/post', data); From da6141ff466c00c1ce603b99ffec38e319fe2c78 Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 17:15:30 +0900 Subject: [PATCH 14/27] =?UTF-8?q?Fix:=20TopBarLayout=EC=9D=98=20props?= =?UTF-8?q?=EB=A5=BC=20=EC=A0=84=EC=B2=B4=20TopBarProps=EA=B0=80=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20$withBorder=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/TopBar/styles.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/TopBar/styles.tsx b/src/components/TopBar/styles.tsx index 2ab92929..0c2aefb7 100644 --- a/src/components/TopBar/styles.tsx +++ b/src/components/TopBar/styles.tsx @@ -4,8 +4,7 @@ import theme from '@styles/theme'; import { StyledText } from '@components/Text/StyledText'; -import type { TopBarLayoutProps } from './dto'; -export const TopBarLayout = styled.header` +export const TopBarLayout = styled.header<{ $withBorder: boolean }>` display: flex; position: sticky; top: 0; /* 부모 요소의 상단에 붙도록 설정 */ From 6be0f0c00b17b458ff07599724157c8b6073af7e Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 17:37:18 +0900 Subject: [PATCH 15/27] =?UTF-8?q?Fix:=20pages=20=EB=A6=B0=ED=8A=B8=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Account/AccountCancel/index.tsx | 226 +++++----- src/pages/Account/AccountSetting/index.tsx | 213 +++++----- src/pages/Chats/ChatRoomItem/index.tsx | 4 +- .../LikeCommentBottomSheetContent/index.tsx | 5 +- src/pages/Post/PostBase/index.tsx | 3 +- src/pages/Post/PostImageSelect/index.tsx | 2 + .../Post/PostUpload/ImageSwiper/index.tsx | 4 +- src/pages/Profile/ProfileEdit/index.tsx | 398 +++++++++--------- src/pages/Profile/index.tsx | 308 +++++++------- 9 files changed, 583 insertions(+), 580 deletions(-) diff --git a/src/pages/Account/AccountCancel/index.tsx b/src/pages/Account/AccountCancel/index.tsx index 9f9c7456..86070a97 100644 --- a/src/pages/Account/AccountCancel/index.tsx +++ b/src/pages/Account/AccountCancel/index.tsx @@ -2,10 +2,12 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import theme from '@styles/theme'; -import { getCurrentUserId } from '@utils/getCurrentUserId'; + import { patchUserWithdrawApi } from '@apis/user'; +import { getCurrentUserId } from '@utils/getCurrentUserId'; import back from '@assets/arrow/left.svg'; + import BottomButton from '@components/BottomButton/index'; import { OODDFrame } from '@components/Frame/Frame'; import Modal from '@components/Modal/index'; @@ -13,119 +15,119 @@ import { StyledText } from '@components/Text/StyledText'; import TopBar from '@components/TopBar/index'; import { - CancelContainer, - SubTitle, - Text, - InfoBox, - InfoItem, - CheckboxWrapper, - CheckboxInput, - Label, - StyledCheckboxText, - StyledDiv, + CancelContainer, + SubTitle, + Text, + InfoBox, + InfoItem, + CheckboxWrapper, + CheckboxInput, + Label, + StyledCheckboxText, + StyledDiv, } from './styles'; const AccountCancel: React.FC = () => { - const [isChecked, setIsChecked] = useState(false); - const [modalContent, setModalContent] = useState(null); - const [isModalVisible, setIsModalVisible] = useState(false); - const navigate = useNavigate(); - - const handleCheckboxChange = () => { - setIsChecked(!isChecked); - }; - - const handleModalClose = () => { - setIsModalVisible(false); - setModalContent(null); - }; - - const handleDeleteAccount = async () => { - try { - if (!isChecked) { - setModalContent('탈퇴 안내사항에 동의해야 합니다.'); - setIsModalVisible(true); - return; - } - - const currentUserId = getCurrentUserId(); - const token = localStorage.getItem('new_jwt_token'); - - if (!currentUserId || !token) { - setModalContent('사용자 정보를 찾을 수 없습니다.'); - setIsModalVisible(true); - return; - } - - const response = await patchUserWithdrawApi(currentUserId); - - if (response.isSuccess) { - setModalContent('계정이 성공적으로 삭제되었습니다.'); - setIsModalVisible(true); - localStorage.clear(); - - setTimeout(() => { - navigate('/login'); - }, 2000); - } else { - setModalContent(response.code || '알 수 없는 오류가 발생했습니다.'); - setIsModalVisible(true); - } - } catch (error) { - console.error('계정 삭제하는데 오류남:', error); - setModalContent('계정을 삭제하는 동안 오류가 발생했습니다. 다시 시도해 주세요.'); - setIsModalVisible(true); - } - }; - - return ( - - - navigate(-1)} /> - - - OOTD 탈퇴 전 확인하세요! - - - - - {`탈퇴하시면 이용 중인 서비스가 폐쇄되며,\n모든 데이터는 복구할 수 없습니다.`} - - - - - - 지금까지 OODD를 이용해주셔서 감사합니다! - - - - - - - - - - - {isModalVisible && ( - - )} - - ); + const [isChecked, setIsChecked] = useState(false); + const [modalContent, setModalContent] = useState(null); + const [isModalVisible, setIsModalVisible] = useState(false); + const navigate = useNavigate(); + + const handleCheckboxChange = () => { + setIsChecked(!isChecked); + }; + + const handleModalClose = () => { + setIsModalVisible(false); + setModalContent(null); + }; + + const handleDeleteAccount = async () => { + try { + if (!isChecked) { + setModalContent('탈퇴 안내사항에 동의해야 합니다.'); + setIsModalVisible(true); + return; + } + + const currentUserId = getCurrentUserId(); + const token = localStorage.getItem('new_jwt_token'); + + if (!currentUserId || !token) { + setModalContent('사용자 정보를 찾을 수 없습니다.'); + setIsModalVisible(true); + return; + } + + const response = await patchUserWithdrawApi(currentUserId); + + if (response.isSuccess) { + setModalContent('계정이 성공적으로 삭제되었습니다.'); + setIsModalVisible(true); + localStorage.clear(); + + setTimeout(() => { + navigate('/login'); + }, 2000); + } else { + setModalContent(response.code || '알 수 없는 오류가 발생했습니다.'); + setIsModalVisible(true); + } + } catch (error) { + console.error('계정 삭제하는데 오류남:', error); + setModalContent('계정을 삭제하는 동안 오류가 발생했습니다. 다시 시도해 주세요.'); + setIsModalVisible(true); + } + }; + + return ( + + + navigate(-1)} /> + + + OOTD 탈퇴 전 확인하세요! + + + + + {`탈퇴하시면 이용 중인 서비스가 폐쇄되며,\n모든 데이터는 복구할 수 없습니다.`} + + + + + + 지금까지 OODD를 이용해주셔서 감사합니다! + + + + + + + + + + + {isModalVisible && ( + + )} + + ); }; -export default AccountCancel; \ No newline at end of file +export default AccountCancel; diff --git a/src/pages/Account/AccountSetting/index.tsx b/src/pages/Account/AccountSetting/index.tsx index c1bfd315..99adb521 100644 --- a/src/pages/Account/AccountSetting/index.tsx +++ b/src/pages/Account/AccountSetting/index.tsx @@ -2,8 +2,9 @@ import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import theme from '@styles/theme'; -import { getCurrentUserId } from '@utils/getCurrentUserId'; + import { getUserInfoApi } from '@apis/user'; +import { getCurrentUserId } from '@utils/getCurrentUserId'; import back from '@assets/arrow/left.svg'; import imageBasic from '@assets/default/defaultProfile.svg'; @@ -18,116 +19,108 @@ import TopBar from '@components/TopBar/index'; import type { UserInfoData } from '@apis/user/dto'; -import { - ProfileEditContainer, - ProfilePic, - ProfilePicWrapper, - Label, - Row, - List, - ListItem -} from './styles'; +import { ProfileEditContainer, ProfilePic, ProfilePicWrapper, Label, Row, List, ListItem } from './styles'; const AccountSetting: React.FC = () => { - const navigate = useNavigate(); - const [isLogoutModalOpen, setIsLogoutModalOpen] = useState(false); - const [userProfile, setUserProfile] = useState(null); - const [isLoading, setIsLoading] = useState(true); - - useEffect(() => { - const getUserInfo = async () => { - try { - const currentUserId = getCurrentUserId(); - if (!currentUserId) { - console.error('User is not logged in'); - return; - } - - const response = await getUserInfoApi(currentUserId); - setUserProfile(response.data); - } catch (error) { - console.error('Error fetching user info:', error); - } finally { - setIsLoading(false); - } - }; - - getUserInfo(); - }, []); - - const handleConfirmLogout = () => { - localStorage.clear(); - console.log('Logout confirmed'); - setIsLogoutModalOpen(false); - navigate('/login'); - }; - - const handleLogoutClick = () => { - setIsLogoutModalOpen(true); - }; - - const handleCloseModal = () => { - setIsLogoutModalOpen(false); - }; - - const handleDeleteAccountClick = () => { - navigate('/account/cancel'); - }; - - if (isLoading) { - return ; - } - - return ( - - - navigate(-1)} /> - - - 프로필 사진 - - - - - - - - - - - - 로그아웃 아이콘 - - Logout - - - - 회원 탈퇴 아이콘 - - 회원탈퇴 - - - - - {isLogoutModalOpen && ( - - )} - - - ); + const navigate = useNavigate(); + const [isLogoutModalOpen, setIsLogoutModalOpen] = useState(false); + const [userProfile, setUserProfile] = useState(null); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + const getUserInfo = async () => { + try { + const currentUserId = getCurrentUserId(); + if (!currentUserId) { + console.error('User is not logged in'); + return; + } + + const response = await getUserInfoApi(currentUserId); + setUserProfile(response.data); + } catch (error) { + console.error('Error fetching user info:', error); + } finally { + setIsLoading(false); + } + }; + + getUserInfo(); + }, []); + + const handleConfirmLogout = () => { + localStorage.clear(); + console.log('Logout confirmed'); + setIsLogoutModalOpen(false); + navigate('/login'); + }; + + const handleLogoutClick = () => { + setIsLogoutModalOpen(true); + }; + + const handleCloseModal = () => { + setIsLogoutModalOpen(false); + }; + + const handleDeleteAccountClick = () => { + navigate('/account/cancel'); + }; + + if (isLoading) { + return ; + } + + return ( + + + navigate(-1)} /> + + + 프로필 사진 + + + + + + + + + + + + 로그아웃 아이콘 + + Logout + + + + 회원 탈퇴 아이콘 + + 회원탈퇴 + + + + + {isLogoutModalOpen && ( + + )} + + + ); }; -export default AccountSetting; \ No newline at end of file +export default AccountSetting; diff --git a/src/pages/Chats/ChatRoomItem/index.tsx b/src/pages/Chats/ChatRoomItem/index.tsx index 75cc6afd..0798cfa7 100644 --- a/src/pages/Chats/ChatRoomItem/index.tsx +++ b/src/pages/Chats/ChatRoomItem/index.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import dayjs from 'dayjs'; +import dayjs, { extend } from 'dayjs'; import relativeTime from 'dayjs/plugin/relativeTime'; import { useRecoilState } from 'recoil'; @@ -18,12 +18,12 @@ import type { ChatRoomData } from '@apis/chatting/dto'; import { UserImage, ChatRoomItemLayout, LeftBox, RightBox, LatestMessage } from './styles'; import 'dayjs/locale/ko'; -dayjs.extend(relativeTime); const ChatRoomItem: React.FC = ({ id, otherUser, latestMessage }) => { const [timeAgo, setTimeAgo] = useState(null); const [, setOtherUser] = useRecoilState(OtherUserAtom); const nav = useNavigate(); + extend(relativeTime); const handleChatRoomClick = () => { setOtherUser(otherUser); diff --git a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx index 300a1e60..ee0ada50 100644 --- a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx +++ b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx @@ -25,8 +25,6 @@ import X from '@assets/default/x.svg'; import Loading from '@components/Loading'; import Modal from '@components/Modal'; import { StyledText } from '@components/Text/StyledText'; -import CommentItem from './CommentItem/index'; -import MenuButtonList from './MenuButtonList/index'; import type { Comment, GetCommentListResponse } from '@apis/post-comment/dto'; import type { GetPostLikeListResponse } from '@apis/post-like/dto'; @@ -34,6 +32,9 @@ import type { ModalProps } from '@components/Modal/dto'; import type { LikeCommentBottomSheetProps } from '../dto'; +import CommentItem from './CommentItem/index'; +import MenuButtonList from './MenuButtonList/index'; + import { TabContainer, Tab, ContentContainer, Content, BigUserProfile, LikeItem, InputLayout } from './styles'; const LikeCommentBottomSheetContent: React.FC = ({ tab, likeCount, commentCount }) => { diff --git a/src/pages/Post/PostBase/index.tsx b/src/pages/Post/PostBase/index.tsx index b0c904bc..6c38df20 100644 --- a/src/pages/Post/PostBase/index.tsx +++ b/src/pages/Post/PostBase/index.tsx @@ -13,10 +13,11 @@ import { postIdAtom, userAtom, isPostRepresentativeAtom } from '@recoil/Post/Pos import { getCurrentUserId } from '@utils/getCurrentUserId'; import Left from '@assets/arrow/left.svg'; -import Like from '@components/Icons/Like'; import Message from '@assets/default/message.svg'; import More from '@assets/default/more.svg'; +import Like from '@components/Icons/Like'; + import BottomSheet from '@components/BottomSheet'; import ClothingInfoItem from '@components/ClothingInfoItem'; import { OODDFrame } from '@components/Frame/Frame'; diff --git a/src/pages/Post/PostImageSelect/index.tsx b/src/pages/Post/PostImageSelect/index.tsx index 25d54552..7ca8729e 100644 --- a/src/pages/Post/PostImageSelect/index.tsx +++ b/src/pages/Post/PostImageSelect/index.tsx @@ -15,6 +15,7 @@ import { getCurrentUserId } from '@utils/getCurrentUserId'; import Left from '@assets/arrow/left.svg'; import X from '@assets/default/x.svg'; + import Photo from '@components/Icons/Photo'; import BottomButton from '@components/BottomButton'; @@ -23,6 +24,7 @@ import { StyledText } from '@components/Text/StyledText'; import TopBar from '@components/TopBar'; import ImageSwiper from './ImageSwiper/index'; + import { UploadContainer, ImageDragDropContainer, Content } from './styles'; const PostImageSelect: React.FC = () => { diff --git a/src/pages/Post/PostUpload/ImageSwiper/index.tsx b/src/pages/Post/PostUpload/ImageSwiper/index.tsx index a643f0c2..7d95520f 100644 --- a/src/pages/Post/PostUpload/ImageSwiper/index.tsx +++ b/src/pages/Post/PostUpload/ImageSwiper/index.tsx @@ -1,6 +1,6 @@ import { useRef } from 'react'; -import ReactDOMServer from 'react-dom/server'; +import { renderToString } from 'react-dom/server'; import { Navigation, Pagination } from 'swiper/modules'; import { Swiper, SwiperRef, SwiperSlide } from 'swiper/react'; import 'swiper/css'; @@ -32,7 +32,7 @@ const ImageSwiper: React.FC = ({ images }) => { el: '.swiper-pagination', type: 'custom', renderCustom: (_, current, total) => { - const photoIcon = ReactDOMServer.renderToString(); + const photoIcon = renderToString(); return `
${photoIcon} diff --git a/src/pages/Profile/ProfileEdit/index.tsx b/src/pages/Profile/ProfileEdit/index.tsx index 420a59eb..cb38acfa 100644 --- a/src/pages/Profile/ProfileEdit/index.tsx +++ b/src/pages/Profile/ProfileEdit/index.tsx @@ -1,11 +1,13 @@ import { useRef, useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; + import { ref, uploadBytes, getDownloadURL } from 'firebase/storage'; import theme from '@styles/theme'; -import { getCurrentUserId } from '@utils/getCurrentUserId'; + import { getUserInfoApi, patchUserInfoApi } from '@apis/user'; import { storage } from '@config/firebaseConfig'; +import { getCurrentUserId } from '@utils/getCurrentUserId'; import back from '@assets/arrow/left.svg'; import camera from '@assets/default/camera.svg'; @@ -21,208 +23,208 @@ import TopBar from '@components/TopBar/index'; import type { UserInfoData, PatchUserInfoRequest } from '@apis/user/dto'; import { - ProfileEditContainer, - ProfilePic, - ProfilePicWrapper, - Input, - Button, - Row, - FileInput, - CameraIcon, - UserInfo, - Username, - EmailInput, + ProfileEditContainer, + ProfilePic, + ProfilePicWrapper, + Input, + Button, + Row, + FileInput, + CameraIcon, + UserInfo, + Username, + EmailInput, } from './styles'; type ExtendedUserInfoData = UserInfoData & { - birthDate?: string; + birthDate?: string; }; const ProfileEdit: React.FC = () => { - const fileInputRef = useRef(null); - const [nickname, setNickname] = useState(''); - const [bio, setBio] = useState(''); - const [profilePictureUrl, setProfilePictureUrl] = useState(null); - const [phoneNumber, setPhoneNumber] = useState(''); - const [birthDate, setBirthDate] = useState(''); - const [name, setName] = useState(''); - const [email, setEmail] = useState(''); - const [isLoading, setIsLoading] = useState(true); - const navigate = useNavigate(); - const [modalContent, setModalContent] = useState(null); - const [isModalVisible, setIsModalVisible] = useState(false); - const [uploading, setUploading] = useState(false); - const userId = getCurrentUserId(); - - useEffect(() => { - const getUserInfo = async () => { - try { - const currentUserId = getCurrentUserId(); - if (!currentUserId) { - console.error('User ID not found'); - return; - } - - const response = await getUserInfoApi(currentUserId); - const userInfo: ExtendedUserInfoData = response.data; - - setNickname(userInfo.nickname); - setBio(userInfo.bio); - setProfilePictureUrl(userInfo.profilePictureUrl || null); - setPhoneNumber(userInfo.phoneNumber || ''); - setBirthDate(userInfo.birthDate || ''); - setName(userInfo.name || ''); - setEmail(userInfo.email || ''); - } catch (error) { - console.error('Error fetching user info:', error); - } finally { - setIsLoading(false); - } - }; - - getUserInfo(); - }, []); - - const handleButtonClick = () => { - fileInputRef.current?.click(); - }; - - const handleFileChange = async (event: React.ChangeEvent) => { - const file = event.target.files?.[0]; - if (file) { - setUploading(true); - try { - const storageRef = ref(storage, `profilePictures/${file.name}`); - await uploadBytes(storageRef, file); - const imageUrl = await getDownloadURL(storageRef); - setProfilePictureUrl(imageUrl); - console.log('File uploaded and URL retrieved:', imageUrl); - } catch (error) { - console.error('Error uploading file:', error); - } finally { - setUploading(false); - } - } - }; - - const handleModalClose = () => { - setIsModalVisible(false); - setModalContent(null); - }; - - const handleSave = async () => { - try { - const currentUserId = getCurrentUserId(); - if (!currentUserId) { - console.error('User ID not found'); - return; - } - - const formattedBirthDate = birthDate ? new Date(birthDate).toISOString().split('T')[0] : ''; - - const payload: PatchUserInfoRequest = { - name: name || 'Default Name', - phoneNumber: phoneNumber || '000-0000-0000', - birthDate: formattedBirthDate, - email: email || 'default@example.com', - nickname: nickname || '닉네임 없음', - profilePictureUrl: profilePictureUrl || '', - bio: bio || '', - }; - - const response = await patchUserInfoApi(payload, currentUserId); - - if (response.isSuccess) { - setModalContent('프로필이 성공적으로 수정되었습니다.'); - setIsModalVisible(true); - - setTimeout(() => { - handleModalClose(); - navigate(`/profile/${userId}`); - }, 2000); - } else { - setModalContent('프로필 수정에 실패했습니다.'); - setIsModalVisible(true); - } - } catch (error) { - setModalContent('프로필 수정 중 오류가 발생했습니다.'); - setIsModalVisible(true); - console.error('Error updating user info:', error); - } - }; - - if (isLoading || uploading) { - return ; - } - - return ( - - - navigate(-1)} /> - {isModalVisible && ( - - )} - - - 프로필 사진 - - - - - - - {nickname || '알수없음'} - - - - - 이름 - - setName(e.target.value)} /> - - - - 닉네임 - - setNickname(e.target.value)} /> - - - - 소개글 - - setBio(e.target.value)} /> - - - - 전화번호 - - setPhoneNumber(e.target.value)} /> - - - - 생년월일 - - setBirthDate(e.target.value)} /> - - - - 이메일 - - setEmail(e.target.value)} /> - - - - - ); + const fileInputRef = useRef(null); + const [nickname, setNickname] = useState(''); + const [bio, setBio] = useState(''); + const [profilePictureUrl, setProfilePictureUrl] = useState(null); + const [phoneNumber, setPhoneNumber] = useState(''); + const [birthDate, setBirthDate] = useState(''); + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [isLoading, setIsLoading] = useState(true); + const navigate = useNavigate(); + const [modalContent, setModalContent] = useState(null); + const [isModalVisible, setIsModalVisible] = useState(false); + const [uploading, setUploading] = useState(false); + const userId = getCurrentUserId(); + + useEffect(() => { + const getUserInfo = async () => { + try { + const currentUserId = getCurrentUserId(); + if (!currentUserId) { + console.error('User ID not found'); + return; + } + + const response = await getUserInfoApi(currentUserId); + const userInfo: ExtendedUserInfoData = response.data; + + setNickname(userInfo.nickname); + setBio(userInfo.bio); + setProfilePictureUrl(userInfo.profilePictureUrl || null); + setPhoneNumber(userInfo.phoneNumber || ''); + setBirthDate(userInfo.birthDate || ''); + setName(userInfo.name || ''); + setEmail(userInfo.email || ''); + } catch (error) { + console.error('Error fetching user info:', error); + } finally { + setIsLoading(false); + } + }; + + getUserInfo(); + }, []); + + const handleButtonClick = () => { + fileInputRef.current?.click(); + }; + + const handleFileChange = async (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (file) { + setUploading(true); + try { + const storageRef = ref(storage, `profilePictures/${file.name}`); + await uploadBytes(storageRef, file); + const imageUrl = await getDownloadURL(storageRef); + setProfilePictureUrl(imageUrl); + console.log('File uploaded and URL retrieved:', imageUrl); + } catch (error) { + console.error('Error uploading file:', error); + } finally { + setUploading(false); + } + } + }; + + const handleModalClose = () => { + setIsModalVisible(false); + setModalContent(null); + }; + + const handleSave = async () => { + try { + const currentUserId = getCurrentUserId(); + if (!currentUserId) { + console.error('User ID not found'); + return; + } + + const formattedBirthDate = birthDate ? new Date(birthDate).toISOString().split('T')[0] : ''; + + const payload: PatchUserInfoRequest = { + name: name || 'Default Name', + phoneNumber: phoneNumber || '000-0000-0000', + birthDate: formattedBirthDate, + email: email || 'default@example.com', + nickname: nickname || '닉네임 없음', + profilePictureUrl: profilePictureUrl || '', + bio: bio || '', + }; + + const response = await patchUserInfoApi(payload, currentUserId); + + if (response.isSuccess) { + setModalContent('프로필이 성공적으로 수정되었습니다.'); + setIsModalVisible(true); + + setTimeout(() => { + handleModalClose(); + navigate(`/profile/${userId}`); + }, 2000); + } else { + setModalContent('프로필 수정에 실패했습니다.'); + setIsModalVisible(true); + } + } catch (error) { + setModalContent('프로필 수정 중 오류가 발생했습니다.'); + setIsModalVisible(true); + console.error('Error updating user info:', error); + } + }; + + if (isLoading || uploading) { + return ; + } + + return ( + + + navigate(-1)} /> + {isModalVisible && ( + + )} + + + 프로필 사진 + + + + + + + {nickname || '알수없음'} + + + + + 이름 + + setName(e.target.value)} /> + + + + 닉네임 + + setNickname(e.target.value)} /> + + + + 소개글 + + setBio(e.target.value)} /> + + + + 전화번호 + + setPhoneNumber(e.target.value)} /> + + + + 생년월일 + + setBirthDate(e.target.value)} /> + + + + 이메일 + + setEmail(e.target.value)} /> + + + + + ); }; -export default ProfileEdit; \ No newline at end of file +export default ProfileEdit; diff --git a/src/pages/Profile/index.tsx b/src/pages/Profile/index.tsx index ca04aae1..400eca2a 100644 --- a/src/pages/Profile/index.tsx +++ b/src/pages/Profile/index.tsx @@ -1,13 +1,15 @@ import { useState, useEffect } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; + import { useRecoilValue } from 'recoil'; import theme from '@styles/theme'; -import { OtherUserAtom } from '@recoil/util/OtherUser'; -import { getCurrentUserId } from '@utils/getCurrentUserId'; + import { createMatchingApi } from '@apis/matching'; import { getUserPostListApi } from '@apis/post'; import { getUserInfoApi } from '@apis/user'; +import { OtherUserAtom } from '@recoil/util/OtherUser'; +import { getCurrentUserId } from '@utils/getCurrentUserId'; import BackSvg from '@assets/arrow/left.svg'; import imageBasic from '@assets/default/defaultProfile.svg'; @@ -32,159 +34,159 @@ import ButtonSecondary from './ButtonSecondary/index'; import NavbarProfile from './NavbarProfile/index'; import { - ProfileContainer, - Header, - StatsContainer, - Stat, - StatNumber, - StatLabel, - PostsContainer, - AddButton, - NoPostWrapper, - Button, + ProfileContainer, + Header, + StatsContainer, + Stat, + StatNumber, + StatLabel, + PostsContainer, + AddButton, + NoPostWrapper, + Button, } from './styles'; const Profile: React.FC = () => { - const { userId } = useParams<{ userId: string }>(); - const profileUserId = Number(userId); - const loggedInUserId = getCurrentUserId(); - const otherUser = useRecoilValue(OtherUserAtom); - - const [isLoading, setIsLoading] = useState(true); - const [posts, setPosts] = useState([]); - const [totalPosts, setTotalPosts] = useState(0); - const [userInfo, setUserInfo] = useState(null); - const [isBottomSheetOpen, setIsBottomSheetOpen] = useState(false); - const [isOptionsBottomSheetOpen, setIsOptionsBottomSheetOpen] = useState(false); - const [isModalOpen, setIsModalOpen] = useState(false); - const [modalContent, setModalContent] = useState(''); - const navigate = useNavigate(); - - const isMyPage = loggedInUserId === profileUserId; - - useEffect(() => { - const fetchData = async () => { - try { - const response = await getUserInfoApi(profileUserId); - const postResponse = await getUserPostListApi(1, 10, profileUserId); - setUserInfo(response.data); - setPosts(postResponse.data.post); - setTotalPosts(postResponse.data.totalPostsCount); - } catch (error) { - console.error('데이터 가져오기 실패:', error); - } finally { - setIsLoading(false); - } - }; - fetchData(); - }, [profileUserId]); - - const createMatching = async (message: string) => { - const matchingRequestData = { - requesterId: loggedInUserId, - targetId: otherUser?.id || profileUserId, - message: message, - }; - - try { - await createMatchingApi(matchingRequestData); - handleModalOpen(`${userInfo?.nickname}님에게 대표 OOTD와 \n한 줄 메세지를 보냈어요!`); - } catch (error) { - console.error('매칭 신청 오류:', error); - handleModalOpen('매칭 신청에 실패했습니다.'); - } - }; - - const handleModalOpen = (message: string) => { - setIsBottomSheetOpen(false); - setModalContent(message); - setIsModalOpen(true); - }; - - if (isLoading) return ; - - return ( - - - {isMyPage && ( - navigate('/post/upload/photo/select')}> - Add - - )} - - {isMyPage ? ( - - ) : ( - navigate(-1)} - onClickRightButton={() => setIsOptionsBottomSheetOpen(true)} - /> - )} - -
- -
- - {isMyPage ? : } - - - - OOTD - {totalPosts || 0} - - {isMyPage && ( - - 코멘트 - {posts.reduce((sum, post) => sum + (post.postCommentsCount || 0), 0)} - - )} - - 좋아요 - {posts.reduce((sum, post) => sum + (post.postLikesCount || 0), 0)} - - - - - {posts.length > 0 ? ( - posts.map((post) => ) - ) : ( - - - 게시물이 없어요. - - - )} - - - {isMyPage && } - - setIsBottomSheetOpen(false)} - /> - - setIsOptionsBottomSheetOpen(false)} - /> - - {isModalOpen && setIsModalOpen(false)} />} -
-
- ); + const { userId } = useParams<{ userId: string }>(); + const profileUserId = Number(userId); + const loggedInUserId = getCurrentUserId(); + const otherUser = useRecoilValue(OtherUserAtom); + + const [isLoading, setIsLoading] = useState(true); + const [posts, setPosts] = useState([]); + const [totalPosts, setTotalPosts] = useState(0); + const [userInfo, setUserInfo] = useState(null); + const [isBottomSheetOpen, setIsBottomSheetOpen] = useState(false); + const [isOptionsBottomSheetOpen, setIsOptionsBottomSheetOpen] = useState(false); + const [isModalOpen, setIsModalOpen] = useState(false); + const [modalContent, setModalContent] = useState(''); + const navigate = useNavigate(); + + const isMyPage = loggedInUserId === profileUserId; + + useEffect(() => { + const fetchData = async () => { + try { + const response = await getUserInfoApi(profileUserId); + const postResponse = await getUserPostListApi(1, 10, profileUserId); + setUserInfo(response.data); + setPosts(postResponse.data.post); + setTotalPosts(postResponse.data.totalPostsCount); + } catch (error) { + console.error('데이터 가져오기 실패:', error); + } finally { + setIsLoading(false); + } + }; + fetchData(); + }, [profileUserId]); + + const createMatching = async (message: string) => { + const matchingRequestData = { + requesterId: loggedInUserId, + targetId: otherUser?.id || profileUserId, + message: message, + }; + + try { + await createMatchingApi(matchingRequestData); + handleModalOpen(`${userInfo?.nickname}님에게 대표 OOTD와 \n한 줄 메세지를 보냈어요!`); + } catch (error) { + console.error('매칭 신청 오류:', error); + handleModalOpen('매칭 신청에 실패했습니다.'); + } + }; + + const handleModalOpen = (message: string) => { + setIsBottomSheetOpen(false); + setModalContent(message); + setIsModalOpen(true); + }; + + if (isLoading) return ; + + return ( + + + {isMyPage && ( + navigate('/post/upload/photo/select')}> + Add + + )} + + {isMyPage ? ( + + ) : ( + navigate(-1)} + onClickRightButton={() => setIsOptionsBottomSheetOpen(true)} + /> + )} + +
+ +
+ + {isMyPage ? : } + + + + OOTD + {totalPosts || 0} + + {isMyPage && ( + + 코멘트 + {posts.reduce((sum, post) => sum + (post.postCommentsCount || 0), 0)} + + )} + + 좋아요 + {posts.reduce((sum, post) => sum + (post.postLikesCount || 0), 0)} + + + + + {posts.length > 0 ? ( + posts.map((post) => ) + ) : ( + + + 게시물이 없어요. + + + )} + + + {isMyPage && } + + setIsBottomSheetOpen(false)} + /> + + setIsOptionsBottomSheetOpen(false)} + /> + + {isModalOpen && setIsModalOpen(false)} />} +
+
+ ); }; -export default Profile; \ No newline at end of file +export default Profile; From c01651fda7c412b47f466aa60cec4a6762dde43f Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 17:37:28 +0900 Subject: [PATCH 16/27] =?UTF-8?q?Fix:=20GlobalStyles=20=EB=A6=B0=ED=8A=B8?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/styles/GlobalStyles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/GlobalStyles.ts b/src/styles/GlobalStyles.ts index 4d5330c7..49dda526 100644 --- a/src/styles/GlobalStyles.ts +++ b/src/styles/GlobalStyles.ts @@ -1,5 +1,5 @@ import { createGlobalStyle } from 'styled-components'; -import reset from 'styled-reset'; +import { reset } from 'styled-reset'; const GlobalStyles = createGlobalStyle` ${reset} From ed4c7fca2900563b911bc5eaf2649e36f46f792c Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 17:57:01 +0900 Subject: [PATCH 17/27] =?UTF-8?q?Fix:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=97=90=EC=84=9C=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20=EB=9D=BC=EC=9A=B0=ED=8C=85=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Post/PostBase/index.tsx | 9 +-------- src/pages/Post/PostBase/styles.tsx | 4 +++- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/pages/Post/PostBase/index.tsx b/src/pages/Post/PostBase/index.tsx index 6c38df20..9f5df391 100644 --- a/src/pages/Post/PostBase/index.tsx +++ b/src/pages/Post/PostBase/index.tsx @@ -63,7 +63,6 @@ const PostBase: React.FC = ({ onClickMenu }) => { const [activeTab, setActiveTab] = useState<'likes' | 'comments'>('likes'); // activeTab state const { postId } = useParams<{ postId: string }>(); - const userId = getCurrentUserId(); const nav = useNavigate(); @@ -73,13 +72,7 @@ const PostBase: React.FC = ({ onClickMenu }) => { }; const handleUserClick = () => { - if (post?.isPostWriter) { - // 내 게시물인 경우 - nav(`/profile/${userId}`); - } else { - // 다른 유저의 게시물인 경우 - nav(`/users/${post?.user.id}`); - } + nav(`/profile/${post?.user.id}`); }; const contentRef = useRef(null); diff --git a/src/pages/Post/PostBase/styles.tsx b/src/pages/Post/PostBase/styles.tsx index a0f40f83..8ec77731 100644 --- a/src/pages/Post/PostBase/styles.tsx +++ b/src/pages/Post/PostBase/styles.tsx @@ -88,7 +88,9 @@ export const UserProfile = styled(LoadingSkeleton)` } `; -export const UserName = styled(StyledText)``; +export const UserName = styled(StyledText)` + cursor: pointer; +`; export const MenuBtn = styled.button` width: 18px; From 37f0db6c3c26dbb01ea7994fbfa5db900c089dc2 Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 17:57:41 +0900 Subject: [PATCH 18/27] =?UTF-8?q?Feat:=20Feed=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=EC=97=90=20relativeTime=20=ED=94=8C=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Chats/ChatRoomItem/index.tsx | 2 -- src/pages/Home/OOTD/Feed/index.tsx | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/Chats/ChatRoomItem/index.tsx b/src/pages/Chats/ChatRoomItem/index.tsx index 0798cfa7..6e04a3d5 100644 --- a/src/pages/Chats/ChatRoomItem/index.tsx +++ b/src/pages/Chats/ChatRoomItem/index.tsx @@ -17,8 +17,6 @@ import type { ChatRoomData } from '@apis/chatting/dto'; import { UserImage, ChatRoomItemLayout, LeftBox, RightBox, LatestMessage } from './styles'; -import 'dayjs/locale/ko'; - const ChatRoomItem: React.FC = ({ id, otherUser, latestMessage }) => { const [timeAgo, setTimeAgo] = useState(null); const [, setOtherUser] = useRecoilState(OtherUserAtom); diff --git a/src/pages/Home/OOTD/Feed/index.tsx b/src/pages/Home/OOTD/Feed/index.tsx index 66dc117f..842e6580 100644 --- a/src/pages/Home/OOTD/Feed/index.tsx +++ b/src/pages/Home/OOTD/Feed/index.tsx @@ -1,7 +1,8 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import dayjs from 'dayjs'; +import dayjs, { extend } from 'dayjs'; +import relativeTime from 'dayjs/plugin/relativeTime'; import { Pagination } from 'swiper/modules'; import { Swiper, SwiperSlide } from 'swiper/react'; import 'swiper/css'; @@ -58,6 +59,7 @@ const Feed: React.FC = ({ feed }) => { const [isStatusModalOpen, setIsStatusModalOpen] = useState(false); const [modalContent, setModalContent] = useState(''); + extend(relativeTime); const nav = useNavigate(); const currentUserId = getCurrentUserId(); const timeAgo = dayjs(feed.createdAt).locale('ko').fromNow(); From 16eff7e2b437869d3956498226bc2d707ed22c3e Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 18:03:23 +0900 Subject: [PATCH 19/27] =?UTF-8?q?Fix:=20getCurrentUserId=EB=A1=9C=20?= =?UTF-8?q?=EB=B0=9B=EC=95=84=EC=98=A4=EB=8A=94=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EA=B0=9C=EB=B3=84=20=EB=B3=80=EC=88=98=EB=AA=85=EC=9D=84=20cur?= =?UTF-8?q?rentUserId=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PostBase/LikeCommentBottomSheetContent/index.tsx | 12 ++++-------- src/pages/Post/PostBase/index.tsx | 1 - src/pages/Post/PostImageSelect/index.tsx | 4 ++-- src/pages/Post/PostInstaFeedSelect/index.tsx | 4 ++-- src/pages/Post/PostUpload/index.tsx | 4 ++-- src/pages/Post/index.tsx | 6 +++--- src/pages/Profile/ProfileEdit/index.tsx | 6 ++---- src/pages/Profile/index.tsx | 6 +++--- 8 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx index ee0ada50..5afa2315 100644 --- a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx +++ b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx @@ -69,6 +69,7 @@ const LikeCommentBottomSheetContent: React.FC = ({ const { postId } = useParams<{ postId: string }>(); const nav = useNavigate(); + const currentUserId = getCurrentUserId(); // 댓글 메뉴 클릭한 경우 const handleMenuOpen = (comment: Comment, event: React.MouseEvent) => { @@ -80,10 +81,7 @@ const LikeCommentBottomSheetContent: React.FC = ({ // 유저 클릭한 경우 const handleUserClick = (userId: number) => { - // 로컬 스토리지에서 사용자 ID 가져오기 - const myUserId = getCurrentUserId(); // 로컬 스토리지에 저장된 사용자 ID를 가져옴 - - if (String(myUserId) === String(userId)) { + if (currentUserId === userId) { // 나인 경우 nav(`/profile/${userId}`); } else { @@ -190,10 +188,8 @@ const LikeCommentBottomSheetContent: React.FC = ({ // 유저 차단 api const postUserBlock = async () => { - const storedUserId = getCurrentUserId(); - // 사용자 ID 또는 선택된 댓글이 없으면 함수 종료 - if (!storedUserId || !selectedComment) { + if (!currentUserId || !selectedComment) { setModalContent('유저 정보를 찾을 수 없습니다.'); setIsStatusModalOpen(true); return; @@ -201,7 +197,7 @@ const LikeCommentBottomSheetContent: React.FC = ({ try { const blockRequest: PostUserBlockRequest = { - requesterId: Number(storedUserId), + requesterId: currentUserId, targetId: selectedComment.user.id, action: 'block', }; diff --git a/src/pages/Post/PostBase/index.tsx b/src/pages/Post/PostBase/index.tsx index 9f5df391..e4274c92 100644 --- a/src/pages/Post/PostBase/index.tsx +++ b/src/pages/Post/PostBase/index.tsx @@ -10,7 +10,6 @@ import theme from '@styles/theme'; import { getPostDetailApi } from '@apis/post'; import { togglePostLikeStatusApi } from '@apis/post-like'; import { postIdAtom, userAtom, isPostRepresentativeAtom } from '@recoil/Post/PostAtom'; -import { getCurrentUserId } from '@utils/getCurrentUserId'; import Left from '@assets/arrow/left.svg'; import Message from '@assets/default/message.svg'; diff --git a/src/pages/Post/PostImageSelect/index.tsx b/src/pages/Post/PostImageSelect/index.tsx index 7ca8729e..8cb1c567 100644 --- a/src/pages/Post/PostImageSelect/index.tsx +++ b/src/pages/Post/PostImageSelect/index.tsx @@ -37,10 +37,10 @@ const PostImageSelect: React.FC = () => { const fileInputRef = useRef(null); const location = useLocation(); const navigate = useNavigate(); - const userId = getCurrentUserId(); + const currentUserId = getCurrentUserId(); const handleClose = () => { - navigate(`/profile/${userId}`); + navigate(`/profile/${currentUserId}`); }; const handlePrev = () => { diff --git a/src/pages/Post/PostInstaFeedSelect/index.tsx b/src/pages/Post/PostInstaFeedSelect/index.tsx index 96d3d976..6d358c37 100644 --- a/src/pages/Post/PostInstaFeedSelect/index.tsx +++ b/src/pages/Post/PostInstaFeedSelect/index.tsx @@ -26,7 +26,7 @@ const PostInstaFeedSelect: React.FC = () => { const [posts, setPosts] = useState([]); // Post 타입으로 지정 const [, setImages] = useRecoilState(postImagesAtom); const navigate = useNavigate(); - const userId = getCurrentUserId(); + const currentUserId = getCurrentUserId(); // 인스타그램 데이터 가져오는 함수 const fetchInstagramData = async (accessToken: string) => { @@ -75,7 +75,7 @@ const PostInstaFeedSelect: React.FC = () => { // 페이지 종료 함수 const handleClose = () => { - navigate(`/profile/${userId}`); + navigate(`/profile/${currentUserId}`); }; return ( diff --git a/src/pages/Post/PostUpload/index.tsx b/src/pages/Post/PostUpload/index.tsx index 32c75f3d..92906aa8 100644 --- a/src/pages/Post/PostUpload/index.tsx +++ b/src/pages/Post/PostUpload/index.tsx @@ -69,7 +69,7 @@ const PostUpload: React.FC = () => { const [modalContent, setModalContent] = useState('알 수 없는 오류입니다.\n관리자에게 문의해 주세요.'); const location = useLocation(); const navigate = useNavigate(); - const userId = getCurrentUserId(); + const currentUserId = getCurrentUserId(); const styletags = [ 'classic', @@ -240,7 +240,7 @@ const PostUpload: React.FC = () => { setSelectedStyletag([]); setMode(''); - navigate(`/profile/${userId}`); + navigate(`/profile/${currentUserId}`); } catch (error) { const errorMessage = handleError(error, 'post'); setModalContent(errorMessage); diff --git a/src/pages/Post/index.tsx b/src/pages/Post/index.tsx index baddc707..ad69bbfd 100644 --- a/src/pages/Post/index.tsx +++ b/src/pages/Post/index.tsx @@ -38,7 +38,7 @@ const Post: React.FC = () => { const [postPinStatus, setPostPinStatus] = useState<'지정' | '해제'>('지정'); const navigate = useNavigate(); - const userId = getCurrentUserId(); + const currentUserId = getCurrentUserId(); const handleMenuOpen = () => { if (isMyPost) { @@ -73,7 +73,7 @@ const Post: React.FC = () => { setModalContent('OOTD 삭제에 성공했어요'); setTimeout(() => { - navigate(`/profile/${userId}`); + navigate(`/profile/${currentUserId}`); }, 1000); } else { setModalContent(`OOTD 삭제에 실패했어요\n잠시 뒤 다시 시도해 보세요`); @@ -89,7 +89,7 @@ const Post: React.FC = () => { useEffect(() => { // 현재 게시글이 내 게시글인지 확인 if (user?.id && postId) { - setIsMyPost(Number(userId) === user.id); + setIsMyPost(currentUserId === user.id); } }, [user, postId]); diff --git a/src/pages/Profile/ProfileEdit/index.tsx b/src/pages/Profile/ProfileEdit/index.tsx index cb38acfa..a3526002 100644 --- a/src/pages/Profile/ProfileEdit/index.tsx +++ b/src/pages/Profile/ProfileEdit/index.tsx @@ -54,12 +54,11 @@ const ProfileEdit: React.FC = () => { const [modalContent, setModalContent] = useState(null); const [isModalVisible, setIsModalVisible] = useState(false); const [uploading, setUploading] = useState(false); - const userId = getCurrentUserId(); + const currentUserId = getCurrentUserId(); useEffect(() => { const getUserInfo = async () => { try { - const currentUserId = getCurrentUserId(); if (!currentUserId) { console.error('User ID not found'); return; @@ -114,7 +113,6 @@ const ProfileEdit: React.FC = () => { const handleSave = async () => { try { - const currentUserId = getCurrentUserId(); if (!currentUserId) { console.error('User ID not found'); return; @@ -140,7 +138,7 @@ const ProfileEdit: React.FC = () => { setTimeout(() => { handleModalClose(); - navigate(`/profile/${userId}`); + navigate(`/profile/${currentUserId}`); }, 2000); } else { setModalContent('프로필 수정에 실패했습니다.'); diff --git a/src/pages/Profile/index.tsx b/src/pages/Profile/index.tsx index 400eca2a..599a56e9 100644 --- a/src/pages/Profile/index.tsx +++ b/src/pages/Profile/index.tsx @@ -49,7 +49,7 @@ import { const Profile: React.FC = () => { const { userId } = useParams<{ userId: string }>(); const profileUserId = Number(userId); - const loggedInUserId = getCurrentUserId(); + const currentUserId = getCurrentUserId(); const otherUser = useRecoilValue(OtherUserAtom); const [isLoading, setIsLoading] = useState(true); @@ -62,7 +62,7 @@ const Profile: React.FC = () => { const [modalContent, setModalContent] = useState(''); const navigate = useNavigate(); - const isMyPage = loggedInUserId === profileUserId; + const isMyPage = currentUserId === profileUserId; useEffect(() => { const fetchData = async () => { @@ -83,7 +83,7 @@ const Profile: React.FC = () => { const createMatching = async (message: string) => { const matchingRequestData = { - requesterId: loggedInUserId, + requesterId: currentUserId, targetId: otherUser?.id || profileUserId, message: message, }; From 4f11bbf40e74e77985031bd6199c50cd62f75c2f Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 18:03:59 +0900 Subject: [PATCH 20/27] =?UTF-8?q?Fix:=20=EB=82=A8=EC=95=84=20=EC=9E=88?= =?UTF-8?q?=EB=8D=98=20users=20=EA=B2=BD=EB=A1=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Post/PostBase/LikeCommentBottomSheetContent/index.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx index 5afa2315..ed0a2cda 100644 --- a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx +++ b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/index.tsx @@ -81,13 +81,7 @@ const LikeCommentBottomSheetContent: React.FC = ({ // 유저 클릭한 경우 const handleUserClick = (userId: number) => { - if (currentUserId === userId) { - // 나인 경우 - nav(`/profile/${userId}`); - } else { - // 다른 유저인 경우 - nav(`/users/${userId}`); - } + nav(`/profile/${userId}`); }; // 댓글 작성 Input From 1d54d0e7265c98ad6c0e2323aa7874afb69597f6 Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 18:26:59 +0900 Subject: [PATCH 21/27] =?UTF-8?q?Fix:=20=EC=BB=AC=EB=9F=AC=EC=8B=9C?= =?UTF-8?q?=EC=8A=A4=ED=85=9C=20=EC=98=A4=EC=A0=81=EC=9A=A9=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ClothingInfoItem/styles.tsx | 2 +- src/components/ConfirmationModal/index.tsx | 4 ++-- src/pages/Account/AccountCancel/index.tsx | 11 ++++------- src/pages/Account/AccountCancel/styles.tsx | 12 +++--------- src/pages/Account/AccountEdit/index.tsx | 4 ++-- src/pages/Account/AccountEdit/styles.tsx | 2 +- src/pages/Account/AccountSetting/index.tsx | 6 +++--- src/pages/Account/Verification/styles.tsx | 6 +++--- src/pages/NotFound/styles.tsx | 2 +- .../LikeCommentBottomSheetContent/styles.tsx | 2 +- src/pages/Post/PostUpload/ToggleSwitch/styles.tsx | 4 ++-- src/pages/Post/PostUpload/styles.tsx | 2 +- src/pages/Profile/NavbarProfile/index.tsx | 2 +- src/pages/Profile/NavbarProfile/styles.tsx | 2 +- src/pages/Profile/ProfileEdit/styles.tsx | 2 +- src/pages/Profile/styles.tsx | 2 +- src/pages/SignUp/TermsAgreement/styles.tsx | 4 ++-- 17 files changed, 30 insertions(+), 39 deletions(-) diff --git a/src/components/ClothingInfoItem/styles.tsx b/src/components/ClothingInfoItem/styles.tsx index 5eb00bfb..8a556f89 100644 --- a/src/components/ClothingInfoItem/styles.tsx +++ b/src/components/ClothingInfoItem/styles.tsx @@ -39,7 +39,7 @@ export const ClothingInfoLeft = styled.div` .model { margin-right: auto; - color: ${({ theme }) => theme.colors.black}; + color: ${({ theme }) => theme.colors.text.primary}; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; diff --git a/src/components/ConfirmationModal/index.tsx b/src/components/ConfirmationModal/index.tsx index 697982ec..fabcf23f 100644 --- a/src/components/ConfirmationModal/index.tsx +++ b/src/components/ConfirmationModal/index.tsx @@ -24,7 +24,7 @@ const ConfirmationModal: React.FC = ({ > - + {content} @@ -36,7 +36,7 @@ const ConfirmationModal: React.FC = ({ onCloseModal(); }} > - + 취소 diff --git a/src/pages/Account/AccountCancel/index.tsx b/src/pages/Account/AccountCancel/index.tsx index 86070a97..17e4dd2c 100644 --- a/src/pages/Account/AccountCancel/index.tsx +++ b/src/pages/Account/AccountCancel/index.tsx @@ -24,7 +24,6 @@ import { CheckboxInput, Label, StyledCheckboxText, - StyledDiv, } from './styles'; const AccountCancel: React.FC = () => { @@ -85,12 +84,12 @@ const AccountCancel: React.FC = () => { navigate(-1)} /> - + OOTD 탈퇴 전 확인하세요! - + {`탈퇴하시면 이용 중인 서비스가 폐쇄되며,\n모든 데이터는 복구할 수 없습니다.`} @@ -99,7 +98,7 @@ const AccountCancel: React.FC = () => { 지금까지 OODD를 이용해주셔서 감사합니다! @@ -115,9 +114,7 @@ const AccountCancel: React.FC = () => { - - - + {isModalVisible && ( theme.colors.gray[200]}; + border: 0.125rem solid ${({ theme }) => theme.colors.border.divider}; border-radius: 0.25rem; position: relative; &:checked { - background-color: ${({ theme }) => theme.colors.background.primaryLight}; + background-color: ${({ theme }) => theme.colors.brand.primaryLight}; border-color: ${({ theme }) => theme.colors.brand.primary}; } &:checked::after { content: '✓'; - color: ${({ theme }) => theme.colors.contrast}; + color: ${({ theme }) => theme.colors.text.contrast}; font-size: 0.875rem; position: absolute; top: 50%; @@ -92,9 +92,3 @@ export const Label = styled.label` export const StyledCheckboxText = styled(StyledText)` color: ${({ theme }) => theme.colors.text.caption}; `; - -export const StyledDiv = styled.div<{ isChecked: boolean }>` - background-color: ${({ isChecked, theme }) => (isChecked ? theme.colors.primary : theme.colors.gray[300])}; - color: ${({ isChecked, theme }) => (isChecked ? theme.colors.contrast : theme.colors.caption)}; - cursor: ${({ isChecked }) => (isChecked ? 'pointer' : 'not-allowed')}; -`; diff --git a/src/pages/Account/AccountEdit/index.tsx b/src/pages/Account/AccountEdit/index.tsx index c6ee9c74..2be0eded 100644 --- a/src/pages/Account/AccountEdit/index.tsx +++ b/src/pages/Account/AccountEdit/index.tsx @@ -41,7 +41,7 @@ const AccountEdit: React.FC = () => {
- + 로그인 정보 @@ -64,7 +64,7 @@ const AccountEdit: React.FC = () => {
- + 회원 정보 diff --git a/src/pages/Account/AccountEdit/styles.tsx b/src/pages/Account/AccountEdit/styles.tsx index 4fb7366f..65eb681d 100644 --- a/src/pages/Account/AccountEdit/styles.tsx +++ b/src/pages/Account/AccountEdit/styles.tsx @@ -84,7 +84,7 @@ export const Label = styled.div` export const Info = styled.div` font-size: 0.875rem; - color: ${({ theme }) => theme.colors.caption}; + color: ${({ theme }) => theme.colors.text.caption}; margin-left: 0.625rem; flex-grow: 1; text-align: left; diff --git a/src/pages/Account/AccountSetting/index.tsx b/src/pages/Account/AccountSetting/index.tsx index 99adb521..75f1bcbc 100644 --- a/src/pages/Account/AccountSetting/index.tsx +++ b/src/pages/Account/AccountSetting/index.tsx @@ -81,7 +81,7 @@ const AccountSetting: React.FC = () => { @@ -98,13 +98,13 @@ const AccountSetting: React.FC = () => { 로그아웃 아이콘 - + Logout 회원 탈퇴 아이콘 - + 회원탈퇴 diff --git a/src/pages/Account/Verification/styles.tsx b/src/pages/Account/Verification/styles.tsx index 78d6b9a4..23a57005 100644 --- a/src/pages/Account/Verification/styles.tsx +++ b/src/pages/Account/Verification/styles.tsx @@ -45,7 +45,7 @@ export const Button = styled.button` padding: 1.25rem; margin-top: 300px; font-size: 0.875rem; - color: ${({ theme }) => theme.colors.contrast}; + color: ${({ theme }) => theme.colors.text.contrast}; background-color: ${({ theme, disabled }) => (disabled ? theme.colors.gray[300] : theme.colors.black)}; border: none; border-radius: 0.3125rem; @@ -76,7 +76,7 @@ export const Timer = styled.div` top: 50%; transform: translateY(-50%); font-size: 1rem; - color: ${({ theme }) => theme.colors.red || theme.colors.brand.primary}; + color: ${({ theme }) => theme.colors.brand.primary}; `; export const ResendButton = styled.button` @@ -86,7 +86,7 @@ export const ResendButton = styled.button` transform: translateY(-50%); padding: 0.625rem; font-size: 0.875rem; - color: ${({ theme }) => theme.colors.black}; + color: ${({ theme }) => theme.colors.text.primary}; background: none; border: none; cursor: pointer; diff --git a/src/pages/NotFound/styles.tsx b/src/pages/NotFound/styles.tsx index 915337f2..cb7a5f66 100644 --- a/src/pages/NotFound/styles.tsx +++ b/src/pages/NotFound/styles.tsx @@ -45,6 +45,6 @@ export const StyledButton = styled(StyledText)` &.prev { background-color: ${({ theme }) => theme.colors.brand.primary}; - color: ${({ theme }) => theme.colors.white}; + color: ${({ theme }) => theme.colors.text.contrast}; } `; diff --git a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/styles.tsx b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/styles.tsx index c61584f1..21da8d11 100644 --- a/src/pages/Post/PostBase/LikeCommentBottomSheetContent/styles.tsx +++ b/src/pages/Post/PostBase/LikeCommentBottomSheetContent/styles.tsx @@ -114,7 +114,7 @@ export const InputLayout = styled.div` width: 50px; height: 50px; border-radius: 8px; - color: ${({ theme }) => theme.colors.white}; + color: ${({ theme }) => theme.colors.text.contrast}; border: none; font-size: 0.875rem; } diff --git a/src/pages/Post/PostUpload/ToggleSwitch/styles.tsx b/src/pages/Post/PostUpload/ToggleSwitch/styles.tsx index b8d69b7c..98084266 100644 --- a/src/pages/Post/PostUpload/ToggleSwitch/styles.tsx +++ b/src/pages/Post/PostUpload/ToggleSwitch/styles.tsx @@ -18,7 +18,7 @@ export const HiddenCheckbox = styled.input.attrs({ type: 'checkbox' })` width: 25px; height: 25px; border-radius: 50%; - background-color: ${({ theme }) => theme.colors.white}; + background-color: ${({ theme }) => theme.colors.background.primary}; border: 1.5px solid ${({ theme }) => theme.colors.border.active}; transition: left 250ms linear; } @@ -29,7 +29,7 @@ export const HiddenCheckbox = styled.input.attrs({ type: 'checkbox' })` } &:checked::before { - background-color: white; + background-color: ${({ theme }) => theme.colors.background.primary}; left: 25px; } `; diff --git a/src/pages/Post/PostUpload/styles.tsx b/src/pages/Post/PostUpload/styles.tsx index 17a34396..9eb65c7a 100644 --- a/src/pages/Post/PostUpload/styles.tsx +++ b/src/pages/Post/PostUpload/styles.tsx @@ -168,7 +168,7 @@ export const StyletagItem = styled.span<{ selected: boolean }>` cursor: pointer; .tag { - color: ${({ selected, theme }) => (selected ? theme.colors.white : theme.colors.brand.primary)}; + color: ${({ selected, theme }) => (selected ? theme.colors.text.contrast : theme.colors.brand.primary)}; } `; diff --git a/src/pages/Profile/NavbarProfile/index.tsx b/src/pages/Profile/NavbarProfile/index.tsx index 811eca61..d4878322 100644 --- a/src/pages/Profile/NavbarProfile/index.tsx +++ b/src/pages/Profile/NavbarProfile/index.tsx @@ -11,7 +11,7 @@ import { Nav, IconContainer } from './styles'; const NavbarProfile: React.FC = () => { return (
@@ -167,12 +167,12 @@ const SearchBottomSheetContent: React.FC = ({ onClose, o handleClothingInfoAdd(searchResultItem)}> {searchResultItem.title.replace(/<[^]+>/g, '')} />
- + {searchResultItem.brand} {removeBrandFromTitle(searchResultItem.title, searchResultItem.brand)} @@ -183,7 +183,7 @@ const SearchBottomSheetContent: React.FC = ({ onClose, o
{isLoading && ( - + 로딩 중 diff --git a/src/pages/Post/PostUpload/index.tsx b/src/pages/Post/PostUpload/index.tsx index 92906aa8..54e49cfb 100644 --- a/src/pages/Post/PostUpload/index.tsx +++ b/src/pages/Post/PostUpload/index.tsx @@ -343,21 +343,21 @@ const PostUpload: React.FC = () => {
- + 스타일 태그 {isStyletagListOpen ? ( ) : selectedStyletag.length === 0 ? ( <> - + 미지정 ) : ( - + #{selectedStyletag[0]} @@ -371,7 +371,7 @@ const PostUpload: React.FC = () => { onClick={() => handleStyletagSelect(tag)} selected={selectedStyletag[0] === tag} > - + #{tag} @@ -381,7 +381,7 @@ const PostUpload: React.FC = () => { - 대표 OOTD 지정 + 대표 OOTD 지정
From cb83aab893d45934bc57c2a2bc29821a831872f2 Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 18:36:09 +0900 Subject: [PATCH 23/27] =?UTF-8?q?Fix:=20PostBase=20&=20Profile=20=EC=9D=BC?= =?UTF-8?q?=EB=B6=80=20=EC=BD=94=EB=93=9C=20=ED=9D=90=EB=A6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Post/PostBase/index.tsx | 3 +-- src/pages/Profile/index.tsx | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/pages/Post/PostBase/index.tsx b/src/pages/Post/PostBase/index.tsx index e4274c92..990daa75 100644 --- a/src/pages/Post/PostBase/index.tsx +++ b/src/pages/Post/PostBase/index.tsx @@ -62,6 +62,7 @@ const PostBase: React.FC = ({ onClickMenu }) => { const [activeTab, setActiveTab] = useState<'likes' | 'comments'>('likes'); // activeTab state const { postId } = useParams<{ postId: string }>(); + const contentRef = useRef(null); const nav = useNavigate(); @@ -74,8 +75,6 @@ const PostBase: React.FC = ({ onClickMenu }) => { nav(`/profile/${post?.user.id}`); }; - const contentRef = useRef(null); - const toggleTextDisplay = () => { setShowFullText((prev) => !prev); }; diff --git a/src/pages/Profile/index.tsx b/src/pages/Profile/index.tsx index 599a56e9..5748896b 100644 --- a/src/pages/Profile/index.tsx +++ b/src/pages/Profile/index.tsx @@ -47,11 +47,6 @@ import { } from './styles'; const Profile: React.FC = () => { - const { userId } = useParams<{ userId: string }>(); - const profileUserId = Number(userId); - const currentUserId = getCurrentUserId(); - const otherUser = useRecoilValue(OtherUserAtom); - const [isLoading, setIsLoading] = useState(true); const [posts, setPosts] = useState([]); const [totalPosts, setTotalPosts] = useState(0); @@ -62,6 +57,11 @@ const Profile: React.FC = () => { const [modalContent, setModalContent] = useState(''); const navigate = useNavigate(); + const { userId } = useParams<{ userId: string }>(); + const profileUserId = Number(userId); + const currentUserId = getCurrentUserId(); + const otherUser = useRecoilValue(OtherUserAtom); + const isMyPage = currentUserId === profileUserId; useEffect(() => { From d45900579b2d174e3abc2be5ba55844434543413 Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 18:36:58 +0900 Subject: [PATCH 24/27] =?UTF-8?q?Fix:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BB=A4=EC=84=9C=20=ED=8F=AC=EC=9D=B8=ED=84=B0=20?= =?UTF-8?q?css=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Profile/styles.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/Profile/styles.tsx b/src/pages/Profile/styles.tsx index 10de6cb6..7db238d6 100644 --- a/src/pages/Profile/styles.tsx +++ b/src/pages/Profile/styles.tsx @@ -58,7 +58,6 @@ export const PostsContainer = styled.div` flex-wrap: wrap; justify-content: space-between; gap: 15px; - cursor: pointer; margin-bottom: 100px; padding: 20px; `; From d3fea10adecf47547e088a983b82171faf7f6722 Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 18:44:55 +0900 Subject: [PATCH 25/27] =?UTF-8?q?Fix:=20Home=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=AA=A8=EB=8B=AC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Home/OOTD/index.tsx | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/pages/Home/OOTD/index.tsx b/src/pages/Home/OOTD/index.tsx index 46fc288a..edf31e5b 100644 --- a/src/pages/Home/OOTD/index.tsx +++ b/src/pages/Home/OOTD/index.tsx @@ -3,12 +3,8 @@ import { useState, useEffect, useRef } from 'react'; import debounce from 'lodash/debounce'; import { getPostListApi } from '@apis/post'; -import { handleError } from '@apis/util/handleError'; - -import Modal from '@components/Modal'; import type { PostSummary } from '@apis/post/dto'; -import type { ModalProps } from '@components/Modal/dto'; import Feed from './Feed/index'; @@ -17,9 +13,6 @@ import { OOTDContainer, FeedContainer } from './styles'; const OOTD: React.FC = () => { const [feeds, setFeeds] = useState([]); - const [modalContent, setModalContent] = useState('알 수 없는 오류입니다.\n관리자에게 문의해 주세요.'); - const [isStatusModalOpen, setIsStatusModalOpen] = useState(false); - const isFetchingRef = useRef(false); const isReachedEndRef = useRef(false); const feedPageRef = useRef(1); @@ -51,10 +44,6 @@ const OOTD: React.FC = () => { feedPageRef.current += 1; } } - } catch (error) { - const errorMessage = handleError(error); - setModalContent(errorMessage); - setIsStatusModalOpen(true); } finally { isFetchingRef.current = false; console.log(feeds); @@ -109,13 +98,6 @@ const OOTD: React.FC = () => { }; }, []); - const statusModalProps: ModalProps = { - content: modalContent, - onClose: () => { - setIsStatusModalOpen(false); - }, - }; - return ( @@ -127,7 +109,6 @@ const OOTD: React.FC = () => { {/* Intersection Observer가 감지할 마지막 요소 */}
- {isStatusModalOpen && } ); }; From fc4ebb7b301812bc924f4684f74cea66de2147d3 Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 18:55:01 +0900 Subject: [PATCH 26/27] =?UTF-8?q?Fix:=20PostItem=20&=20UserProfile?= =?UTF-8?q?=EC=9D=84=20components=20=ED=8F=B4=EB=8D=94=EC=97=90=EC=84=9C?= =?UTF-8?q?=20Profile=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/{components => pages/Profile}/PostItem/dto.ts | 0 src/{components => pages/Profile}/PostItem/index.tsx | 0 src/{components => pages/Profile}/PostItem/style.tsx | 0 src/{components => pages/Profile}/UserProfile/dto.ts | 0 src/{components => pages/Profile}/UserProfile/index.tsx | 0 src/{components => pages/Profile}/UserProfile/style.tsx | 0 src/pages/Profile/index.tsx | 4 ++-- 7 files changed, 2 insertions(+), 2 deletions(-) rename src/{components => pages/Profile}/PostItem/dto.ts (100%) rename src/{components => pages/Profile}/PostItem/index.tsx (100%) rename src/{components => pages/Profile}/PostItem/style.tsx (100%) rename src/{components => pages/Profile}/UserProfile/dto.ts (100%) rename src/{components => pages/Profile}/UserProfile/index.tsx (100%) rename src/{components => pages/Profile}/UserProfile/style.tsx (100%) diff --git a/src/components/PostItem/dto.ts b/src/pages/Profile/PostItem/dto.ts similarity index 100% rename from src/components/PostItem/dto.ts rename to src/pages/Profile/PostItem/dto.ts diff --git a/src/components/PostItem/index.tsx b/src/pages/Profile/PostItem/index.tsx similarity index 100% rename from src/components/PostItem/index.tsx rename to src/pages/Profile/PostItem/index.tsx diff --git a/src/components/PostItem/style.tsx b/src/pages/Profile/PostItem/style.tsx similarity index 100% rename from src/components/PostItem/style.tsx rename to src/pages/Profile/PostItem/style.tsx diff --git a/src/components/UserProfile/dto.ts b/src/pages/Profile/UserProfile/dto.ts similarity index 100% rename from src/components/UserProfile/dto.ts rename to src/pages/Profile/UserProfile/dto.ts diff --git a/src/components/UserProfile/index.tsx b/src/pages/Profile/UserProfile/index.tsx similarity index 100% rename from src/components/UserProfile/index.tsx rename to src/pages/Profile/UserProfile/index.tsx diff --git a/src/components/UserProfile/style.tsx b/src/pages/Profile/UserProfile/style.tsx similarity index 100% rename from src/components/UserProfile/style.tsx rename to src/pages/Profile/UserProfile/style.tsx diff --git a/src/pages/Profile/index.tsx b/src/pages/Profile/index.tsx index 5748896b..4953104f 100644 --- a/src/pages/Profile/index.tsx +++ b/src/pages/Profile/index.tsx @@ -22,16 +22,16 @@ import { OODDFrame } from '@components/Frame/Frame'; import Loading from '@components/Loading'; import Modal from '@components/Modal'; import NavBar from '@components/NavBar'; -import PostItem from '@components/PostItem'; import { StyledText } from '@components/Text/StyledText'; import TopBar from '@components/TopBar'; -import UserProfile from '@components/UserProfile'; import type { UserPostSummary } from '@apis/post/dto'; import type { UserInfoData } from '@apis/user/dto'; import ButtonSecondary from './ButtonSecondary/index'; import NavbarProfile from './NavbarProfile/index'; +import PostItem from './PostItem/index'; +import UserProfile from './UserProfile/index'; import { ProfileContainer, From 765b322e086eb9743fa764f0aa669fc31bb1873d Mon Sep 17 00:00:00 2001 From: young Date: Sun, 5 Jan 2025 19:09:55 +0900 Subject: [PATCH 27/27] =?UTF-8?q?Design:=20=EC=B1=84=ED=8C=85=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EB=B0=94=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/default/send-message.svg | 2 +- src/pages/Chats/ChatRoom/ChatBox/index.tsx | 6 +++++- src/pages/Chats/ChatRoom/ChatBox/styles.tsx | 13 ++++--------- src/pages/Chats/ChatRoom/RcvdMessage/styles.tsx | 2 +- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/assets/default/send-message.svg b/src/assets/default/send-message.svg index 65db90d7..ca176b2b 100644 --- a/src/assets/default/send-message.svg +++ b/src/assets/default/send-message.svg @@ -1,4 +1,4 @@ + stroke="#FFBBDA" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" fill="#FFBBDA"/> diff --git a/src/pages/Chats/ChatRoom/ChatBox/index.tsx b/src/pages/Chats/ChatRoom/ChatBox/index.tsx index 95b85d7d..8931cc03 100644 --- a/src/pages/Chats/ChatRoom/ChatBox/index.tsx +++ b/src/pages/Chats/ChatRoom/ChatBox/index.tsx @@ -7,6 +7,8 @@ import { useSocket } from '@context/SocketProvider'; import { OtherUserAtom } from '@recoil/util/OtherUser'; import { getCurrentUserId } from '@utils/getCurrentUserId'; +import SendIcon from '@assets/default/send-message.svg'; + import { ChatBoxContainer, Textarea, SendButton } from './styles'; const ChatBox: React.FC = () => { @@ -75,7 +77,9 @@ const ChatBox: React.FC = () => { onKeyDown={handleEnterKeyDown} onSubmit={handleNewMessageSubmit} /> - + + + ); }; diff --git a/src/pages/Chats/ChatRoom/ChatBox/styles.tsx b/src/pages/Chats/ChatRoom/ChatBox/styles.tsx index 82fd9c43..d0c1f961 100644 --- a/src/pages/Chats/ChatRoom/ChatBox/styles.tsx +++ b/src/pages/Chats/ChatRoom/ChatBox/styles.tsx @@ -1,7 +1,5 @@ import { styled } from 'styled-components'; -import SendIcon from '@assets/default/send-message.svg'; - export const ChatBoxContainer = styled.div` ${({ theme }) => theme.breakPoints}; position: fixed; @@ -14,7 +12,7 @@ export const ChatBoxContainer = styled.div` padding: 0.5rem 1.12rem; background-color: ${({ theme }) => theme.colors.background.primary}; gap: 0.5rem; - border-top: 1px solid ${({ theme }) => theme.colors.gray[300]}; + /* border-top: 1px solid ${({ theme }) => theme.colors.gray[300]}; */ align-items: center; `; @@ -39,12 +37,9 @@ export const Textarea = styled.textarea<{ $isOtherUserValid: boolean }>` `; export const SendButton = styled.button<{ $isOtherUserValid: boolean }>` - padding: 1.12rem; + width: 2rem; + height: 2rem; border-radius: 50%; - background-color: ${({ theme }) => theme.colors.brand.primaryLight}; - background-image: url(${SendIcon}); - background-repeat: no-repeat; - background-position: center; - background-size: 1.2rem 1.2rem; + /* background-color: ${({ theme }) => theme.colors.brand.primaryLight}; */ cursor: ${({ $isOtherUserValid }) => ($isOtherUserValid ? 'pointer' : '')}; `; diff --git a/src/pages/Chats/ChatRoom/RcvdMessage/styles.tsx b/src/pages/Chats/ChatRoom/RcvdMessage/styles.tsx index e6b4d31a..1c659f2b 100644 --- a/src/pages/Chats/ChatRoom/RcvdMessage/styles.tsx +++ b/src/pages/Chats/ChatRoom/RcvdMessage/styles.tsx @@ -10,7 +10,7 @@ export const FirstMessageLayout = styled.div<{ $isSenderChanged: boolean }>` export const MessageLayout = styled.div` display: flex; - margin: 0 auto 0.5rem 2.938rem; + margin: 0 auto 0.5rem 2rem; `; export const UserImage = styled.img`