Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

라우터 구조 변경 (중첩 라우틱 적용, 레이아웃 믹스인 포함) #273

Open
wants to merge 4 commits into
base: 249-layout
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions src/apis/climbing.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
import { AxiosResponse } from 'axios';
import { authClient } from '@src/apis/index';
import {
Climbing,
ClimbingResponse,
ReviewEmojiResponse,
} from '@src/types/apis/climbing.d';
import { Climbing } from '@src/types/climbing';

const CLIMB_BASE_URL = '/climbs';
const buildClimbUrl = (path: string = '') => `${CLIMB_BASE_URL}${path}`;
Expand Down
2 changes: 1 addition & 1 deletion src/components/channel/SearchBottomsheet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { GetBookListRes } from '@src/types/apis/book';
import { useState } from 'react';
import useBook from '@src/hooks/query/useBook';
import styled from 'styled-components';
import { NoDataTextLayout } from '@src/styles/mixins';
// import { NoDataTextLayout } from '@src/styles/mixins';
import BookinfoItem from '@src/components/book/BookinfoItem';
import { ReactComponent as IcnSearch } from '@src/assets/icons/md_outline_search.svg';

Expand Down
5 changes: 2 additions & 3 deletions src/components/communityinfosetting/CommunityInfoSection.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import TitleAndFieldContainer from '@src/components/common/TitleAndFieldContainer';
import CommunityInfoCard from '@src/components/common/CommunityInfoCard';

export interface CommunityInfoProps {
Expand All @@ -18,15 +17,15 @@ const CommunityInfoSection = ({
}: CommunityInfoProps) => {
const subtitle = '공동체 정보';
return (
<TitleAndFieldContainer title={subtitle}>
<div title={subtitle}>
<CommunityInfoCard
name={name}
memberInfo={memberInfo}
creationDate={creationDate}
description={description}
imageUrl={serverImg}
/>
</TitleAndFieldContainer>
</div>
);
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import CommunityButton from '@src/components/common/IconButton';
import TitleAndFieldContainer from '@src/components/common/TitleAndFieldContainer';

const CommunitySettingSection = ({ isOwner }: { isOwner?: boolean }) => {
const subtitle = '공동체 설정';
return (
<TitleAndFieldContainer title={subtitle}>
<div title={subtitle}>
{isOwner && (
<>
<CommunityButton
Expand All @@ -26,7 +25,7 @@ const CommunitySettingSection = ({ isOwner }: { isOwner?: boolean }) => {
onClick={() => alert('leaveCommunity')}
/>
)}
</TitleAndFieldContainer>
</div>
);
};

Expand Down
11 changes: 4 additions & 7 deletions src/components/communitysidebar/CommunitySideBar.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import type { ModalTransition } from '@src/types/modal';
import styled from 'styled-components';
import Scrim from '@src/components/common/Scrim';
import TitleAndFieldContainer from '@src/components/common/TitleAndFieldContainer';
import CommunityButton from '@src/components/common/IconButton';
import { ReactComponent as BiCrown } from '@src/assets/icons/bi_crown.svg';
import useCopyToClipboard from '@src/hooks/useCopyToClipboard';
Expand Down Expand Up @@ -52,16 +51,14 @@ const CommunitySideBar = () => {
<img src={serverInfo?.serverImg ?? ''} alt='server profile' />
<span>{serverInfo?.name}</span>
</CommunityTitleContainer>
<TitleAndFieldContainer title='공동체 기능'>
<div title='공동체 기능'>
<CommunityButton
type='detailInfoSetting'
onClick={handleClickInfoSetting}
/>
<CommunityButton type='copyInvitation' onClick={handleCopy} />
</TitleAndFieldContainer>
<TitleAndFieldContainer
title={`멤버 목록 (${serverInfo?.memberCount})`}
>
</div>
<div title={`멤버 목록 (${serverInfo?.memberCount})`}>
<MemberListContainer>
{memberList?.members.map((member) => (
<MemberItem
Expand All @@ -86,7 +83,7 @@ const CommunitySideBar = () => {
</MemberItem>
))}
</MemberListContainer>
</TitleAndFieldContainer>
</div>
</SideBarContainer>
</Scrim>
);
Expand Down
39 changes: 17 additions & 22 deletions src/pages/addcommunity/CreateNewCommunityPage.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
import React, { useEffect, useState } from 'react';
import styled from 'styled-components';
import Header from '@src/components/common/Header';
import TitleAndFieldContainer from '@src/components/common/TitleAndFieldContainer';
import InputField from '@src/components/common/InputField';
import TextAreaField from '@src/components/common/TextAreaField';
import Button from '@src/components/common/Button';
import ImageUploadField from '@src/components/addcommunity/ImageUploadField';
import { postServer } from '@src/apis/server';
import { useMutation } from '@tanstack/react-query';
import useToast from '@src/hooks/useToast';
import { useNavigate } from 'react-router-dom';
import { ROUTE_PATH } from '@src/constants/routePath';
import { encodeId } from '@src/utils/formatters';
Expand All @@ -22,7 +18,7 @@ const CreateNewCommunityPage = () => {
const [communityDescription, setCommunityDescription] = useState<string>('');
const [isFormValid, setIsFormValid] = useState<boolean>(false);

const addToast = useToast();
// const addToast = useToast();

const navigate = useNavigate();

Expand All @@ -33,7 +29,7 @@ const CreateNewCommunityPage = () => {
serverImg: File | null;
}) => postServer(data),
onSuccess: (response) => {
addToast({ content: '공동체 생성 완료' });
// addToast({ content: '공동체 생성 완료' });
setCommunityName('');
setCommunityImage(null);
setCommunityDescription('');
Expand Down Expand Up @@ -79,31 +75,31 @@ const CreateNewCommunityPage = () => {
<Header text={headerText} headerType={headerType} />
<Main>
<div className='scroll-area'>
<TitleAndFieldContainer title='공동체 이름'>
<InputField
<div title='공동체 이름'>
<input
value={communityName}
placeholder='공동체 이름을 입력하세요'
maxLength={20}
onChange={handleNameChange}
/>
</TitleAndFieldContainer>
<TitleAndFieldContainer title='공동체 사진'>
</div>
<div title='공동체 사진'>
<ImageUploadField
previewImg={
communityImage ? URL.createObjectURL(communityImage) : ''
}
onFileChange={handleFileUpload}
/>
</TitleAndFieldContainer>
<TitleAndFieldContainer title='공동체 소개'>
<TextAreaField
</div>
<div title='공동체 소개'>
<textarea
value={communityDescription}
placeholder='사람들에게 공동체에 대해 조금 더 알려주세요.'
maxLength={200}
rows={6}
onChange={handleDescriptionChange}
/>
</TitleAndFieldContainer>
</div>
</div>
<Button
type='submit'
Expand All @@ -120,12 +116,11 @@ const CreateNewCommunityPage = () => {
export default CreateNewCommunityPage;

const Main = styled.main`
display: flex;
flex-direction: column;
align-items: center;
gap: 1.25rem;
padding: 1.875rem 1.25rem 0;
width: 100%;
height: calc(100svh - 4.375rem);
background-color: ${({ theme }) => theme.colors.neutral50};
// display: flex;
// flex-direction: column;
// align-items: center;
// gap: 1.25rem;
// padding: 1.875rem 1.25rem 0;
// width: 100%;
// background-color: ${({ theme }) => theme.colors.neutral50};
`;
8 changes: 3 additions & 5 deletions src/pages/addcommunity/EnterInvitationPage.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import Header from '@src/components/common/Header';
import styled from 'styled-components';
import TitleAndFieldContainer from '@src/components/common/TitleAndFieldContainer';
import InputField from '@src/components/common/InputField';
import Button from '@src/components/common/Button';
import React, { useEffect, useState } from 'react';
import IntroSection from '@src/components/addcommunity/IntroSection';
Expand Down Expand Up @@ -50,8 +48,8 @@ const EnterInvitationPage = () => {
<Main>
<div className='scroll-area'>
<IntroSection title={introTitleText} bodyLines={introBodyLines} />
<TitleAndFieldContainer title='초대 코드'>
<InputField
<div title='초대 코드'>
<input
type='text'
value={invitationCode}
placeholder='초대장을 입력하세요.'
Expand All @@ -62,7 +60,7 @@ const EnterInvitationPage = () => {
초대 코드는 숫자와 영어 소문자를 혼합한 10-12자리입니다.
</span>
)}
</TitleAndFieldContainer>
</div>
</div>
<Button
type='submit'
Expand Down
2 changes: 1 addition & 1 deletion src/pages/book/RecordListPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type Record from '@src/types/record';
import useRecord from '@src/hooks/query/useRecord';
import { useState } from 'react';
import styled from 'styled-components';
import { NoDataTextLayout } from '@src/styles/mixins';
// import { NoDataTextLayout } from '@src/styles/mixins';
import Header from '@src/components/common/Header';
import Li from '@src/components/book/RecordListItem';

Expand Down
2 changes: 1 addition & 1 deletion src/pages/book/ReviewListPage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import useRecord from '@src/hooks/query/useRecord';
import styled from 'styled-components';
import { NoDataTextLayout } from '@src/styles/mixins';
// import { NoDataTextLayout } from '@src/styles/mixins';
import Header from '@src/components/common/Header';
import ReviewItem from '@src/components/book/ReviewItem';

Expand Down
5 changes: 3 additions & 2 deletions src/pages/book/SearchPage.tsx
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❓ 아래 파일에 관한 변경사항은 이 PR에 최종적으로 포함되지 않는 게 맞을까요? 아래 파일 관련 변경사항을 삭제하는 커밋을 이 브랜치에 추가할 계획이 있으신가요?

  • src/apis/climbing.ts
  • src/components/channel/SearchBottomsheet.tsx
  • src/components/communityinfosetting/CommunityInfoSection.tsx
  • src/components/communityinfosetting/CommunitySettingSection.tsx
  • src/components/communitysidebar/CommunitySideBar.tsx
  • src/pages/addcommunity/CreateNewCommunityPage.tsx
  • src/pages/addcommunity/EnterInvitationPage.tsx
  • src/pages/book/RecordListPage.tsx
  • src/pages/book/ReviewListPage.tsx
  • src/pages/book/SearchPage.tsx
  • src/pages/communityinfosetting/CommunityInfoSettingPage.tsx

Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@ import { useNavigate, createSearchParams, useLocation } from 'react-router-dom';
import { ROUTE_PATH } from '@src/constants/routePath';
import useBook from '@src/hooks/query/useBook';
import styled from 'styled-components';
import { NoDataTextLayout } from '@src/styles/mixins';
// import { NoDataTextLayout } from '@src/styles/mixins';
import BookinfoItem from '@src/components/book/BookinfoItem';
import { ReactComponent as IcnSearch } from '@src/assets/icons/md_outline_search.svg';
import { ReactComponent as IcnClose } from '@src/assets/icons/ck_close.svg';

const SearchPage = () => {
const navigate = useNavigate();
const location = useLocation();
const keyword: string = new URLSearchParams(location.search).get('keyword') ?? '';
const keyword: string =
new URLSearchParams(location.search).get('keyword') ?? '';

// API 요청
const { bookList } = useBook({ keyword });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import styled from 'styled-components';
import Header from '@src/components/common/Header';
import CommunitySettingSection from '@src/components/communityinfosetting/CommunitySettingSection';
import { useQuery } from '@tanstack/react-query';
import { Server } from '@src/types/apis/server.d';
import { AxiosError } from 'axios';
import { getServerOne } from '@src/apis/server';
import useLoaderData from '@src/hooks/useRoaderData';
Expand Down
24 changes: 24 additions & 0 deletions src/router/RootLayout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import React from 'react';
import { Outlet } from 'react-router-dom';
import Bottomsheet from '@src/components/common/Bottomsheet';
import Dialog from '@src/components/common/Dialog';
import CommunitySideBar from '@src/components/communitysidebar/CommunitySideBar';
import RootErrorBoundary from '@src/components/errorBoundary/RootErrorBoundary';
import ErrorCatcher from '@src/components/errorBoundary/ErrorCatcher';
import QueryClientBoundary from '@src/components/queryClient/QueryClientBoundary';
import LoadingPage from '@src/pages/fallback/LoadingPage';

export const RootLayout = () => (
<QueryClientBoundary>
<RootErrorBoundary>
<ErrorCatcher>
<React.Suspense fallback={<LoadingPage />}>
<Outlet />
<Bottomsheet />
<Dialog />
<CommunitySideBar />
</React.Suspense>
</ErrorCatcher>
</RootErrorBoundary>
</QueryClientBoundary>
);
56 changes: 27 additions & 29 deletions src/router/Router.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
import React, { Suspense } from 'react';
import { createBrowserRouter, Outlet } from 'react-router-dom';
import React from 'react';
import { createBrowserRouter } from 'react-router-dom';
import { ROUTE_PATH } from '@src/constants/routePath';
import { checkAuthLoader, isParamLoader } from '@src/router/loader';
import Bottomsheet from '@src/components/common/Bottomsheet';
import Dialog from '@src/components/common/Dialog';
import CommunitySideBar from '@src/components/communitysidebar/CommunitySideBar';
import RootErrorBoundary from '@src/components/errorBoundary/RootErrorBoundary';
import ErrorCatcher from '@src/components/errorBoundary/ErrorCatcher';
import LoadingPage from '@src/pages/fallback/LoadingPage';
import QueryClientBoundary from '@src/components/queryClient/QueryClientBoundary';
import { RootLayout } from '@src/router/RootLayout';
import { BottomButtonLayout, NoDataTextLayout } from '@src/styles/Layout';

/* example */
const RouterExamplePage = React.lazy(
Expand Down Expand Up @@ -102,24 +97,30 @@ const CommunityInfoSettingPage = React.lazy(

const router = createBrowserRouter([
{
element: (
<QueryClientBoundary>
<RootErrorBoundary>
<ErrorCatcher>
<Suspense fallback={<LoadingPage />}>
<Outlet />
<Bottomsheet />
<Dialog />
<CommunitySideBar />
</Suspense>
</ErrorCatcher>
</RootErrorBoundary>
</QueryClientBoundary>
),
errorElement: <h1>Error</h1>,
element: <RootLayout />,
loader: checkAuthLoader,
children: [
/* example */
{
/* Button이 잇는 경우 Layout */
element: <BottomButtonLayout />,
children: [
{
path: ROUTE_PATH.createServer,
element: <CreateNewCommunityPage />,
},
],
},
{
/* 데이터가 없는 경우 Layout */
element: <NoDataTextLayout />,
children: [
{
path: ROUTE_PATH.libraryBookSearch,
element: <SearchPage />,
},
],
},
/* 이외의 경우 */
{
path: ROUTE_PATH.example,
element: <RouterExamplePage />,
Expand Down Expand Up @@ -152,10 +153,7 @@ const router = createBrowserRouter([
element: <LibraryHomePage />,
loader: (args) => isParamLoader(args, 'memberId'),
},
{
path: ROUTE_PATH.libraryBookSearch,
element: <SearchPage />,
},

{
path: ROUTE_PATH.libraryRecord,
element: <RecordListPage />,
Expand Down
Loading