diff --git a/src/App.tsx b/src/App.tsx index a2bdb87..77fb20a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,52 +1,53 @@ import { BrowserRouter, Routes, Route } from 'react-router-dom'; -import { AppLayout, AuthLayout, HomeLayout } from './components/Layout'; -import ApplicationPage from './pages/Application'; -import ApplyFinishPage from './pages/Application/applyFinishPage'; -import ClubFeePage from './pages/Application/clubFeePage'; + +import Layout from './components/layout'; +import Login from './pages/Auth/Login'; +import FinishStep from './pages/Auth/SignUp/FinishStep'; +import NameStep from './pages/Auth/SignUp/NameStep'; +import StudentIdStep from './pages/Auth/SignUp/StudentIdStep'; +import TermStep from './pages/Auth/SignUp/TermStep'; +import UniversityStep from './pages/Auth/SignUp/UniversityStep'; import ChatListPage from './pages/Chat'; import ChatRoom from './pages/Chat/ChatRoom'; -import ClubDetail from './pages/ClubDetail'; -import ClubList from './pages/ClubList'; -import ClubSearch from './pages/ClubSearch'; -import CouncilDetail from './pages/CouncilDetail'; -import CouncilNotice from './pages/CouncilNotice'; +import ApplicationPage from './pages/Club/Application'; +import ApplyCompletePage from './pages/Club/Application/applyCompletePage'; +import ClubFeePage from './pages/Club/Application/clubFeePage'; +import ClubDetail from './pages/Club/ClubDetail'; +import ClubList from './pages/Club/ClubList'; +import ClubSearch from './pages/Club/ClubSearch'; +import CouncilDetail from './pages/Council/CouncilDetail'; +import CouncilNotice from './pages/Council/CouncilNotice'; import Home from './pages/Home'; import LicensePage from './pages/legal/LicensePage'; import MarketingPolicyPage from './pages/legal/MarketingPolicyPage'; import PrivacyPolicyPage from './pages/legal/PrivacyPolicyPage'; import TermsPage from './pages/legal/TermsPage'; -import Login from './pages/Login'; -import MyPage from './pages/MyPage'; -import Profile from './pages/Profile'; -import FinishStep from './pages/SignUp/FinishStep'; -import NameStep from './pages/SignUp/NameStep'; -import StudentIdStep from './pages/SignUp/StudentIdStep'; -import TermStep from './pages/SignUp/TermStep'; -import UniversityStep from './pages/SignUp/UniversityStep'; +import MyPage from './pages/User/MyPage'; +import Profile from './pages/User/Profile'; function App() { return ( - }> + }> } /> - + } /> } /> - } /> + } /> } /> } /> - }> - } /> - } /> - + }> + } /> + } /> + } /> } /> - }> + }> } /> } /> @@ -54,13 +55,13 @@ function App() { } /> } /> - + } /> } /> } /> } /> } /> - } /> + } /> } /> diff --git a/src/apis/auth/index.ts b/src/apis/auth/index.ts index 8bac7d4..abddb5a 100644 --- a/src/apis/auth/index.ts +++ b/src/apis/auth/index.ts @@ -2,7 +2,7 @@ import { apiClient } from '../client'; import type { ModifyMyInfoRequest, MyInfoResponse, SignupRequest } from './entity'; export const signup = async (data: SignupRequest) => { - const response = await apiClient.post('/users/signup', { + const response = await apiClient.post('users/signup', { body: data, requiresAuth: true, }); @@ -10,21 +10,21 @@ export const signup = async (data: SignupRequest) => { }; export const getMyInfo = async () => { - const response = await apiClient.get('/users/me', { + const response = await apiClient.get('users/me', { requiresAuth: true, }); return response; }; export const logout = async () => { - const response = await apiClient.post('/users/logout', { + const response = await apiClient.post('users/logout', { requiresAuth: true, }); return response; }; export const putMyInfo = async (data: ModifyMyInfoRequest) => { - const response = await apiClient.put('/users/me', { + const response = await apiClient.put('users/me', { body: data, requiresAuth: true, }); @@ -32,7 +32,7 @@ export const putMyInfo = async (data: ModifyMyInfoRequest) => { }; export const deleteMyAccount = async () => { - const response = await apiClient.delete('/users/withdraw', { + const response = await apiClient.delete('users/withdraw', { requiresAuth: true, }); return response; diff --git a/src/apis/chat/index.ts b/src/apis/chat/index.ts index f258db0..a62a3bc 100644 --- a/src/apis/chat/index.ts +++ b/src/apis/chat/index.ts @@ -8,14 +8,14 @@ import type { } from './entity'; export const getChatRooms = async () => { - const response = await apiClient.get('/chats/rooms', { + const response = await apiClient.get('chats/rooms', { requiresAuth: true, }); return response; }; export const postChatRooms = async (clubId: number) => { - const response = await apiClient.post('/chats/rooms', { + const response = await apiClient.post('chats/rooms', { body: { clubId }, requiresAuth: true, }); @@ -23,7 +23,7 @@ export const postChatRooms = async (clubId: number) => { }; export const postChatMessage = async (chatRoomId: number, content: string) => { - const response = await apiClient.post(`/chats/rooms/${chatRoomId}/messages`, { + const response = await apiClient.post(`chats/rooms/${chatRoomId}/messages`, { body: { content }, requiresAuth: true, }); @@ -32,7 +32,7 @@ export const postChatMessage = async (chatRoomId: number, content: string) => { export const getChatMessages = async (params: ChatMessageRequestParam) => { const response = await apiClient.get( - `/chats/rooms/${params.chatRoomId}`, + `chats/rooms/${params.chatRoomId}`, { params, requiresAuth: true } ); return response; diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx deleted file mode 100644 index 26a2145..0000000 --- a/src/components/Layout/index.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { Suspense } from 'react'; -import { Outlet } from 'react-router-dom'; -import BottomNav from './BottomNav'; -import Header from './Header'; - -export function AppLayout() { - return ( -
-
- -
- -
-
-
- ); -} - -export function AuthLayout() { - return ( -
-
- -
- -
-
-
- ); -} - -export function HomeLayout() { - return ( -
-
- -
- -
-
- -
- ); -} diff --git a/src/components/Layout/BottomNav/index.tsx b/src/components/layout/BottomNav/index.tsx similarity index 100% rename from src/components/Layout/BottomNav/index.tsx rename to src/components/layout/BottomNav/index.tsx diff --git a/src/components/Layout/Header/index.tsx b/src/components/layout/Header/index.tsx similarity index 98% rename from src/components/Layout/Header/index.tsx rename to src/components/layout/Header/index.tsx index 9d20b35..326ee5c 100644 --- a/src/components/Layout/Header/index.tsx +++ b/src/components/layout/Header/index.tsx @@ -2,7 +2,7 @@ import { Link, useLocation, useNavigate, useParams } from 'react-router-dom'; import ChatCircleIcon from '@/assets/svg/chat-circle.svg'; import ChevronLeftIcon from '@/assets/svg/chevron-left.svg'; import useChat from '@/pages/Chat/hooks/useChat'; -import { useMyInfo } from '@/pages/Profile/hooks/useMyInfo'; +import { useMyInfo } from '@/pages/User/Profile/hooks/useMyInfo'; import { ROUTE_TITLES } from './routeTitles'; const INFO_HEADER_LIST = ['/home', '/council']; diff --git a/src/components/Layout/Header/routeTitles.ts b/src/components/layout/Header/routeTitles.ts similarity index 100% rename from src/components/Layout/Header/routeTitles.ts rename to src/components/layout/Header/routeTitles.ts diff --git a/src/components/layout/index.tsx b/src/components/layout/index.tsx new file mode 100644 index 0000000..eac58c8 --- /dev/null +++ b/src/components/layout/index.tsx @@ -0,0 +1,30 @@ +import { Suspense } from 'react'; +import { Outlet } from 'react-router-dom'; +import { twMerge } from 'tailwind-merge'; +import BottomNav from './BottomNav'; +import Header from './Header'; + +interface LayoutProps { + showBottomNav?: boolean; + contentClassName?: string; +} + +export default function Layout({ showBottomNav = false, contentClassName }: LayoutProps) { + return ( +
+
+ +
+ +
+
+ {showBottomNav && } +
+ ); +} diff --git a/src/index.css b/src/index.css index 79e4c3b..ee5beec 100644 --- a/src/index.css +++ b/src/index.css @@ -18,8 +18,13 @@ } @layer base { + html { + overscroll-behavior: none; + } + body { position: relative; + overscroll-behavior-y: contain; } button { diff --git a/src/pages/Login/index.tsx b/src/pages/Auth/Login/index.tsx similarity index 100% rename from src/pages/Login/index.tsx rename to src/pages/Auth/Login/index.tsx diff --git a/src/pages/SignUp/FinishStep.tsx b/src/pages/Auth/SignUp/FinishStep.tsx similarity index 93% rename from src/pages/SignUp/FinishStep.tsx rename to src/pages/Auth/SignUp/FinishStep.tsx index 0860f10..68f120e 100644 --- a/src/pages/SignUp/FinishStep.tsx +++ b/src/pages/Auth/SignUp/FinishStep.tsx @@ -1,6 +1,6 @@ import { useNavigate } from 'react-router-dom'; import CheckInCircleIcon from '@/assets/svg/check-in-circle.svg'; -import { useMyInfo } from '../Profile/hooks/useMyInfo'; +import { useMyInfo } from '@/pages/User/Profile/hooks/useMyInfo'; function FinishStep() { const navigate = useNavigate(); diff --git a/src/pages/SignUp/NameStep.tsx b/src/pages/Auth/SignUp/NameStep.tsx similarity index 100% rename from src/pages/SignUp/NameStep.tsx rename to src/pages/Auth/SignUp/NameStep.tsx diff --git a/src/pages/SignUp/StudentIdStep.tsx b/src/pages/Auth/SignUp/StudentIdStep.tsx similarity index 100% rename from src/pages/SignUp/StudentIdStep.tsx rename to src/pages/Auth/SignUp/StudentIdStep.tsx diff --git a/src/pages/SignUp/TermStep.tsx b/src/pages/Auth/SignUp/TermStep.tsx similarity index 100% rename from src/pages/SignUp/TermStep.tsx rename to src/pages/Auth/SignUp/TermStep.tsx diff --git a/src/pages/SignUp/UniversityStep.tsx b/src/pages/Auth/SignUp/UniversityStep.tsx similarity index 98% rename from src/pages/SignUp/UniversityStep.tsx rename to src/pages/Auth/SignUp/UniversityStep.tsx index 0716ab1..19035a9 100644 --- a/src/pages/SignUp/UniversityStep.tsx +++ b/src/pages/Auth/SignUp/UniversityStep.tsx @@ -30,7 +30,7 @@ function UniversityStep() { const handleUniversitySelect = (universityId: string) => () => { update({ universityId }); - navigate('/signup/student-id'); + navigate('/signup/studentid'); }; return ( diff --git a/src/pages/SignUp/components/AgreementArrow.tsx b/src/pages/Auth/SignUp/components/AgreementArrow.tsx similarity index 100% rename from src/pages/SignUp/components/AgreementArrow.tsx rename to src/pages/Auth/SignUp/components/AgreementArrow.tsx diff --git a/src/pages/SignUp/components/StepLayout.tsx b/src/pages/Auth/SignUp/components/StepLayout.tsx similarity index 100% rename from src/pages/SignUp/components/StepLayout.tsx rename to src/pages/Auth/SignUp/components/StepLayout.tsx diff --git a/src/pages/SignUp/hooks/useSignup.ts b/src/pages/Auth/SignUp/hooks/useSignup.ts similarity index 100% rename from src/pages/SignUp/hooks/useSignup.ts rename to src/pages/Auth/SignUp/hooks/useSignup.ts diff --git a/src/pages/SignUp/hooks/useUniversity.ts b/src/pages/Auth/SignUp/hooks/useUniversity.ts similarity index 100% rename from src/pages/SignUp/hooks/useUniversity.ts rename to src/pages/Auth/SignUp/hooks/useUniversity.ts diff --git a/src/pages/Application/applyFinishPage.tsx b/src/pages/Club/Application/applyCompletePage.tsx similarity index 94% rename from src/pages/Application/applyFinishPage.tsx rename to src/pages/Club/Application/applyCompletePage.tsx index 88e1bd1..0bc7cdf 100644 --- a/src/pages/Application/applyFinishPage.tsx +++ b/src/pages/Club/Application/applyCompletePage.tsx @@ -2,7 +2,7 @@ import { useParams } from 'react-router-dom'; import CheckCircleIcon from '@/assets/svg/check-circle.svg'; import { useGetClubDetail } from '../ClubDetail/hooks/useGetClubDetail'; -function ApplyFinishPage() { +function ApplyCompletePage() { const { clubId } = useParams(); const { data: clubDetail } = useGetClubDetail(Number(clubId)); @@ -30,4 +30,4 @@ function ApplyFinishPage() { ); } -export default ApplyFinishPage; +export default ApplyCompletePage; diff --git a/src/pages/Application/clubFeePage.tsx b/src/pages/Club/Application/clubFeePage.tsx similarity index 96% rename from src/pages/Application/clubFeePage.tsx rename to src/pages/Club/Application/clubFeePage.tsx index 51fc70a..fb28802 100644 --- a/src/pages/Application/clubFeePage.tsx +++ b/src/pages/Club/Application/clubFeePage.tsx @@ -32,7 +32,7 @@ function ClubFeePage() { diff --git a/src/pages/Application/components/AccountInfo.tsx b/src/pages/Club/Application/components/AccountInfo.tsx similarity index 100% rename from src/pages/Application/components/AccountInfo.tsx rename to src/pages/Club/Application/components/AccountInfo.tsx diff --git a/src/pages/Application/hooks/useClubApply.ts b/src/pages/Club/Application/hooks/useClubApply.ts similarity index 100% rename from src/pages/Application/hooks/useClubApply.ts rename to src/pages/Club/Application/hooks/useClubApply.ts diff --git a/src/pages/Application/hooks/useGetClubFee.ts b/src/pages/Club/Application/hooks/useGetClubFee.ts similarity index 100% rename from src/pages/Application/hooks/useGetClubFee.ts rename to src/pages/Club/Application/hooks/useGetClubFee.ts diff --git a/src/pages/Application/index.tsx b/src/pages/Club/Application/index.tsx similarity index 100% rename from src/pages/Application/index.tsx rename to src/pages/Club/Application/index.tsx diff --git a/src/pages/ClubDetail/components/ClubAccount.tsx b/src/pages/Club/ClubDetail/components/ClubAccount.tsx similarity index 62% rename from src/pages/ClubDetail/components/ClubAccount.tsx rename to src/pages/Club/ClubDetail/components/ClubAccount.tsx index d4593e9..5f73882 100644 --- a/src/pages/ClubDetail/components/ClubAccount.tsx +++ b/src/pages/Club/ClubDetail/components/ClubAccount.tsx @@ -1,6 +1,6 @@ import { useParams } from 'react-router-dom'; -import AccountInfoCard from '@/pages/Application/components/AccountInfo'; -import { useGetClubFee } from '@/pages/Application/hooks/useGetClubFee'; +import AccountInfoCard from '../../Application/components/AccountInfo'; +import { useGetClubFee } from '../../Application/hooks/useGetClubFee'; function ClubAccount() { const { clubId } = useParams(); diff --git a/src/pages/ClubDetail/components/ClubIntro.tsx b/src/pages/Club/ClubDetail/components/ClubIntro.tsx similarity index 100% rename from src/pages/ClubDetail/components/ClubIntro.tsx rename to src/pages/Club/ClubDetail/components/ClubIntro.tsx diff --git a/src/pages/ClubDetail/components/ClubMember.tsx b/src/pages/Club/ClubDetail/components/ClubMember.tsx similarity index 100% rename from src/pages/ClubDetail/components/ClubMember.tsx rename to src/pages/Club/ClubDetail/components/ClubMember.tsx diff --git a/src/pages/ClubDetail/components/ClubRecruitment.tsx b/src/pages/Club/ClubDetail/components/ClubRecruitment.tsx similarity index 100% rename from src/pages/ClubDetail/components/ClubRecruitment.tsx rename to src/pages/Club/ClubDetail/components/ClubRecruitment.tsx diff --git a/src/pages/ClubDetail/hooks/useCouncilNotices.ts b/src/pages/Club/ClubDetail/hooks/useCouncilNotices.ts similarity index 100% rename from src/pages/ClubDetail/hooks/useCouncilNotices.ts rename to src/pages/Club/ClubDetail/hooks/useCouncilNotices.ts diff --git a/src/pages/ClubDetail/hooks/useGetClubDetail.ts b/src/pages/Club/ClubDetail/hooks/useGetClubDetail.ts similarity index 100% rename from src/pages/ClubDetail/hooks/useGetClubDetail.ts rename to src/pages/Club/ClubDetail/hooks/useGetClubDetail.ts diff --git a/src/pages/ClubDetail/hooks/useGetClubMembers.ts b/src/pages/Club/ClubDetail/hooks/useGetClubMembers.ts similarity index 100% rename from src/pages/ClubDetail/hooks/useGetClubMembers.ts rename to src/pages/Club/ClubDetail/hooks/useGetClubMembers.ts diff --git a/src/pages/ClubDetail/hooks/useGetClubRecruitment.ts b/src/pages/Club/ClubDetail/hooks/useGetClubRecruitment.ts similarity index 100% rename from src/pages/ClubDetail/hooks/useGetClubRecruitment.ts rename to src/pages/Club/ClubDetail/hooks/useGetClubRecruitment.ts diff --git a/src/pages/ClubDetail/index.tsx b/src/pages/Club/ClubDetail/index.tsx similarity index 100% rename from src/pages/ClubDetail/index.tsx rename to src/pages/Club/ClubDetail/index.tsx index 989dfe2..fc4fd3d 100644 --- a/src/pages/ClubDetail/index.tsx +++ b/src/pages/Club/ClubDetail/index.tsx @@ -22,6 +22,10 @@ function ClubDetail() { setSearchParams({ tab }, { replace: true }); }; + if (!clubDetail) { + return
잘못된 경로입니다
; + } + const tabs: { key: TabType; label: string; show: boolean }[] = [ { key: 'recruitment', label: '모집', show: clubDetail.recruitment.status !== 'CLOSED' }, { key: 'intro', label: '소개', show: true }, @@ -31,10 +35,6 @@ function ClubDetail() { const visibleTabs = tabs.filter((tab) => tab.show); - if (!clubDetail) { - return
잘못된 경로입니다
; - } - return ( <>
diff --git a/src/pages/ClubList/components/ClubCard.tsx b/src/pages/Club/ClubList/components/ClubCard.tsx similarity index 100% rename from src/pages/ClubList/components/ClubCard.tsx rename to src/pages/Club/ClubList/components/ClubCard.tsx diff --git a/src/pages/ClubList/components/SearchBar.tsx b/src/pages/Club/ClubList/components/SearchBar.tsx similarity index 100% rename from src/pages/ClubList/components/SearchBar.tsx rename to src/pages/Club/ClubList/components/SearchBar.tsx diff --git a/src/pages/ClubList/hooks/useGetClubs.ts b/src/pages/Club/ClubList/hooks/useGetClubs.ts similarity index 100% rename from src/pages/ClubList/hooks/useGetClubs.ts rename to src/pages/Club/ClubList/hooks/useGetClubs.ts diff --git a/src/pages/ClubList/index.tsx b/src/pages/Club/ClubList/index.tsx similarity index 100% rename from src/pages/ClubList/index.tsx rename to src/pages/Club/ClubList/index.tsx diff --git a/src/pages/ClubSearch/index.tsx b/src/pages/Club/ClubSearch/index.tsx similarity index 100% rename from src/pages/ClubSearch/index.tsx rename to src/pages/Club/ClubSearch/index.tsx diff --git a/src/pages/CouncilDetail/components/CouncilIntro.tsx b/src/pages/Council/CouncilDetail/components/CouncilIntro.tsx similarity index 100% rename from src/pages/CouncilDetail/components/CouncilIntro.tsx rename to src/pages/Council/CouncilDetail/components/CouncilIntro.tsx diff --git a/src/pages/CouncilDetail/components/CouncilNotice.tsx b/src/pages/Council/CouncilDetail/components/CouncilNotice.tsx similarity index 95% rename from src/pages/CouncilDetail/components/CouncilNotice.tsx rename to src/pages/Council/CouncilDetail/components/CouncilNotice.tsx index 84452d0..60ac488 100644 --- a/src/pages/CouncilDetail/components/CouncilNotice.tsx +++ b/src/pages/Council/CouncilDetail/components/CouncilNotice.tsx @@ -1,6 +1,6 @@ import { useEffect, useRef } from 'react'; import { Link } from 'react-router-dom'; -import { useCouncilNotice } from '@/pages/ClubDetail/hooks/useCouncilNotices'; +import { useCouncilNotice } from '@/pages/Club/ClubDetail/hooks/useCouncilNotices'; function CouncilNotice() { const observerRef = useRef(null); diff --git a/src/pages/CouncilDetail/hooks/useGetCouncilInfo.ts b/src/pages/Council/CouncilDetail/hooks/useGetCouncilInfo.ts similarity index 100% rename from src/pages/CouncilDetail/hooks/useGetCouncilInfo.ts rename to src/pages/Council/CouncilDetail/hooks/useGetCouncilInfo.ts diff --git a/src/pages/CouncilDetail/index.tsx b/src/pages/Council/CouncilDetail/index.tsx similarity index 100% rename from src/pages/CouncilDetail/index.tsx rename to src/pages/Council/CouncilDetail/index.tsx diff --git a/src/pages/CouncilNotice/hooks/useCouncilNoticeDetail.ts b/src/pages/Council/CouncilNotice/hooks/useCouncilNoticeDetail.ts similarity index 94% rename from src/pages/CouncilNotice/hooks/useCouncilNoticeDetail.ts rename to src/pages/Council/CouncilNotice/hooks/useCouncilNoticeDetail.ts index c53533a..d9c1837 100644 --- a/src/pages/CouncilNotice/hooks/useCouncilNoticeDetail.ts +++ b/src/pages/Council/CouncilNotice/hooks/useCouncilNoticeDetail.ts @@ -44,6 +44,8 @@ export const useGetCouncilNoticeDetail = ({ noticeId }: UseGetCouncilNoticeDetai return changed ? next : old; }); + + queryClient.invalidateQueries({ queryKey: ['myInfo'], refetchType: 'all' }); }, [noticeId, query.data, queryClient]); return query; diff --git a/src/pages/CouncilNotice/index.tsx b/src/pages/Council/CouncilNotice/index.tsx similarity index 100% rename from src/pages/CouncilNotice/index.tsx rename to src/pages/Council/CouncilNotice/index.tsx diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index 5d5c397..7fc5264 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -1,8 +1,8 @@ import { Link } from 'react-router-dom'; import CalendarIcon from '@/assets/svg/calendar.svg'; import Card from '@/components/common/Card'; -import ClubCard from '../ClubList/components/ClubCard'; -import { useGetClubs } from '../ClubList/hooks/useGetClubs'; +import ClubCard from '../Club/ClubList/components/ClubCard'; +import { useGetClubs } from '../Club/ClubList/hooks/useGetClubs'; import SimpleClubCard from './components/SimpleClubCard'; import { useGetJoinedClubs } from './hooks/useGetJoinedClubs'; import { useGetScheduleList } from './hooks/useGetScheduleList'; diff --git a/src/pages/MyPage/hooks/useLogout.ts b/src/pages/User/MyPage/hooks/useLogout.ts similarity index 100% rename from src/pages/MyPage/hooks/useLogout.ts rename to src/pages/User/MyPage/hooks/useLogout.ts diff --git a/src/pages/MyPage/hooks/useWithdraw.ts b/src/pages/User/MyPage/hooks/useWithdraw.ts similarity index 100% rename from src/pages/MyPage/hooks/useWithdraw.ts rename to src/pages/User/MyPage/hooks/useWithdraw.ts diff --git a/src/pages/MyPage/index.tsx b/src/pages/User/MyPage/index.tsx similarity index 100% rename from src/pages/MyPage/index.tsx rename to src/pages/User/MyPage/index.tsx diff --git a/src/pages/Profile/hooks/useMyInfo.ts b/src/pages/User/Profile/hooks/useMyInfo.ts similarity index 100% rename from src/pages/Profile/hooks/useMyInfo.ts rename to src/pages/User/Profile/hooks/useMyInfo.ts diff --git a/src/pages/Profile/index.tsx b/src/pages/User/Profile/index.tsx similarity index 100% rename from src/pages/Profile/index.tsx rename to src/pages/User/Profile/index.tsx