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

[FE] feat: 리뷰 그룹 목록 조회 API 연동 및 MSW 핸들러 수정 #1090

Open
wants to merge 36 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
de753af
feat : 회원용 리뷰 리뷰 생성 폼 API 연결
BadaHertz52 Jan 22, 2025
e1bb55c
feat : ReviewLinkDashboard 리뷰 링크 생성 폼 - 회원용으로 변경
BadaHertz52 Jan 22, 2025
374c27f
refactor : gettingPath 함수로 회원 전용 여부를 path에 표시
BadaHertz52 Jan 22, 2025
fdadd37
refactor : 회원 전용 페이지의 Amplitude용 페이지 이름 변경
BadaHertz52 Jan 22, 2025
27aec28
Merge branch 'fe/refactor/1069-logged-in-path' into fe/feat/1068-logg…
BadaHertz52 Jan 22, 2025
7c780b7
refactor : route path 만드는 함수명 변경
BadaHertz52 Jan 22, 2025
237139b
Merge branch 'fe/refactor/1069-logged-in-path' into fe/feat/1068-logg…
BadaHertz52 Jan 22, 2025
a4ade66
fix : groupAccessCode에 따른 reviewRequestCode 요청 body 변경 오류 수정
BadaHertz52 Jan 23, 2025
720b134
feat : 목킹 핸들러에서 request.body를 분석하는 유틸 함수 구현
BadaHertz52 Jan 23, 2025
99878dc
feat : reviewRequestCode 요청 목킹 핸들러에서 회원용 reviewRequsetCode 반환
BadaHertz52 Jan 23, 2025
0d4eec6
test : 회원용 reviewRequestCode 테스트 추가
BadaHertz52 Jan 23, 2025
b9978ac
refactor: DataForReviewRequestCode 위치 변경
BadaHertz52 Jan 23, 2025
ebf9de8
refactor : 반복되는 usePostDataForReviewRequestCode 테스트 코드 추상화
BadaHertz52 Jan 23, 2025
11178c5
refactoor : 목서버 유효한 리뷰 요청 코드 변수 추상화
BadaHertz52 Jan 23, 2025
3475641
Merge remote-tracking branch 'origin' into fe/feat/1068-loggined-revi…
BadaHertz52 Feb 2, 2025
d43e672
feat: 리뷰 링크 엔드포인트 추가
soosoo22 Feb 9, 2025
db631aa
feat: 리뷰 링크 목록 api 호출 및 인터페이스 정의 추가
soosoo22 Feb 9, 2025
aacd795
feat: 리뷰 링크 목록 목 데이터 추가
soosoo22 Feb 9, 2025
fe194ab
feat: ReviewLinkItem 컴포넌트 구현
soosoo22 Feb 9, 2025
3d87270
feat: useSuspenseQuery로 리뷰 링크 데이터 불러오는 훅 구현
soosoo22 Feb 10, 2025
149cccf
feat: 리뷰 링크 목록 핸들러 추가
soosoo22 Feb 10, 2025
ee7061f
feat: 리뷰 링크 생성 후, 최신 데이터를 불러오기 위한 refetch() 실행 함수 추가
soosoo22 Feb 10, 2025
eb406d7
feat: ReviewLinkItem 클릭 시, 리뷰 목록 페이지로 이동
soosoo22 Feb 10, 2025
6146267
Merge remote-tracking branch 'origin/fe/feat/1068-loggined-review-gro…
soosoo22 Feb 10, 2025
21c9d10
feat: 스크롤 발생 시, paddingRight 변경
soosoo22 Feb 11, 2025
37533ad
refactor: 회원, 비회원에 따라 인터페이스, 핸들러, 목 데이터 수정
soosoo22 Feb 11, 2025
7857738
feat: 회원이 만든 URL일 경우 NavigationTab 및 BackButton 추가
soosoo22 Feb 11, 2025
32bee72
test: 리뷰 그룹 목록 조회 및 비회원일 경우 revieweeId가 null로 반환되는지 테스트 추가
soosoo22 Feb 11, 2025
8e5b331
refactor: 리뷰 링크 핸들러, 목 데이터 수정
soosoo22 Feb 11, 2025
01f0f96
design: 반응형 개선 및 margin, padding 조정
soosoo22 Feb 11, 2025
693a882
refactor: 탭이 활성화되어야 하는 페이지 목록을 포함한 탭 정보 배열을 props로 전달하도록 변경
soosoo22 Feb 12, 2025
76fcf0d
feat: 임시로 isUserLoggedIn 변수 추가해서 로그인 상태에 따라 NavigationTab, Breadcrumb…
soosoo22 Feb 12, 2025
3c73013
design: 리뷰 링크가 없을 경우 border 추가 및 헤더, 푸터 border 수정
soosoo22 Feb 12, 2025
175c65e
Merge remote-tracking branch 'origin/develop' into fe/feat/1080-reive…
soosoo22 Feb 12, 2025
40d0482
feat: theme에 NavigationTab 높이 추가
soosoo22 Feb 12, 2025
c31a51c
refactor: 받은 리뷰가 없을 경우, EmptyContent 적용
soosoo22 Feb 12, 2025
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
3 changes: 2 additions & 1 deletion frontend/src/apis/endpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,12 @@ const endPoint = {
postingDataForReviewRequestCode: `${serverUrl}/${VERSION2}/groups`,
checkingPassword: `${serverUrl}/${VERSION2}/${REVIEW_PASSWORD_API_PARAMS.resource}/${REVIEW_PASSWORD_API_PARAMS.queryString.check}`,
gettingReviewGroupData: (reviewRequestCode: string) =>
`${REVIEW_GROUP_DATA_API_URL}?${REVIEW_GROUP_DATA_API_PARAMS.queryString.reviewRequestCode}=${reviewRequestCode}`,
`${REVIEW_GROUP_DATA_API_URL}/summary?${REVIEW_GROUP_DATA_API_PARAMS.queryString.reviewRequestCode}=${reviewRequestCode}`,
gettingSectionList: `${serverUrl}/${VERSION2}/sections`,
gettingGroupedReviews: (sectionId: number) =>
`${REVIEW_GROUP_API_URL}?${REVIEW_GROUP_API_PARAMS.queryString.sectionId}=${sectionId}`,
postingHighlight: `${serverUrl}/${VERSION2}/highlight`,
gettingReviewLinks: REVIEW_GROUP_DATA_API_URL,
Copy link
Contributor

Choose a reason for hiding this comment

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

gettingReviewLinks가 로그인한 사용자가 자신이 만든 리뷰 그룹 목록을 조회하는게 아닌가요?
자신이 만든 리뷰 그룹 목록을 조회하는거라면 다른 url로 요청을 보내야할 것 같은데요
image

Copy link
Contributor Author

Choose a reason for hiding this comment

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

리뷰 그룹 생성, 리뷰 그룹 목록 조회 url이 같아서 저 상수를 사용했어요.
REVIEW_GROUP_DATA_API_URL === https://api.review-me.page/v2/groups

};

export default endPoint;
17 changes: 17 additions & 0 deletions frontend/src/apis/review.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
GroupedSection,
GroupedReviews,
ReviewInfoData,
ReviewLinks,
} from '@/types';

import createApiErrorMessage from './apiErrorMessageCreator';
Expand Down Expand Up @@ -138,3 +139,19 @@ export const getGroupedReviews = async ({ sectionId }: GetGroupedReviewsProps) =
const data = await response.json();
return data as GroupedReviews;
};

export const getReviewLinksApi = async () => {
const response = await fetch(endPoint.gettingReviewLinks, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
credentials: 'include',
});

if (!response.ok) throw new Error(createApiErrorMessage(response.status));

const data = await response.json();

return data as ReviewLinks;
};
4 changes: 3 additions & 1 deletion frontend/src/components/common/EmptyContent/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,19 @@ interface EmptyContentProps {
iconWidth?: string;
iconMessageGap?: string;
messageFontSize?: string;
isBorder?: boolean;
}

const EmptyContent = ({
iconHeight,
iconWidth,
iconMessageGap,
messageFontSize,
isBorder,
children,
}: EssentialPropsWithChildren<EmptyContentProps>) => {
return (
<S.EmptyContent $iconMessageGap={iconMessageGap}>
<S.EmptyContent $iconMessageGap={iconMessageGap} $isBorder={isBorder}>
<S.Img $height={iconHeight} $width={iconWidth} alt="" src={Icon} />
<S.MessageContainer $messageFontSize={messageFontSize}>{children}</S.MessageContainer>
</S.EmptyContent>
Expand Down
11 changes: 10 additions & 1 deletion frontend/src/components/common/EmptyContent/styles.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
import styled from '@emotion/styled';

export const EmptyContent = styled.div<{ $iconMessageGap?: string }>`
export const EmptyContent = styled.div<{ $iconMessageGap?: string; $isBorder?: boolean }>`
display: flex;
flex-direction: column;
gap: ${(props) => props.$iconMessageGap ?? '3.2rem'};
align-items: center;

${({ theme, $isBorder }) =>
$isBorder &&
`
border: 0.2rem solid ${theme.colors.lightGray};
border-radius: 1rem;
padding: 4rem 0;
`}
`;

interface ImgProps {
$height?: string;
$width?: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ import * as S from './styles';

interface NavItemProps {
label: string;
$isSelected: boolean;
$isActiveTab: boolean;
onClick: () => void;
}

const NavItem = ({ label, $isSelected, onClick }: NavItemProps) => {
const NavItem = ({ label, $isActiveTab, onClick }: NavItemProps) => {
return (
<S.NavItem $isSelected={$isSelected}>
<S.NavItem $isActiveTab={$isActiveTab}>
<button onClick={onClick}>{label}</button>
</S.NavItem>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@ import styled from '@emotion/styled';
import media from '@/utils/media';

interface NavItemProps {
$isSelected: boolean;
$isActiveTab: boolean;
}

export const NavItem = styled.li<NavItemProps>`
border-bottom: 0.3rem solid ${({ theme, $isSelected }) => ($isSelected ? theme.colors.primary : 'none')};
border-bottom: 0.3rem solid ${({ theme, $isActiveTab }) => ($isActiveTab ? theme.colors.primary : 'none')};
padding: 0 1rem 1.3rem 1rem;

button {
font-weight: ${({ theme }) => theme.fontWeight.semibold};
color: ${({ theme, $isSelected }) => ($isSelected ? theme.colors.black : theme.colors.disabled)};
color: ${({ theme, $isActiveTab }) => ($isActiveTab ? theme.colors.black : theme.colors.disabled)};

&:hover {
color: ${({ theme }) => theme.colors.black};
Expand Down
35 changes: 22 additions & 13 deletions frontend/src/components/common/NavigationTab/index.tsx
Original file line number Diff line number Diff line change
@@ -1,24 +1,33 @@
import useNavigationTabs from '@/hooks/useNavigationTabs';
import { useLocation } from 'react-router';

import NavItem from './NavItem';
import * as S from './styles';
export interface Tab {
label: '리뷰 링크 관리' | '작성한 리뷰 확인';
activePathList: string[];
Copy link
Contributor

Choose a reason for hiding this comment

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

공통 컴포넌트라면 label에 올 수 있는 타입을 열어둬야 하지 않을까요?!

handleTabClick: () => void;
}

const NavigationTab = () => {
const { currentTabIndex, tabList } = useNavigationTabs();
interface NavigationTabProps {
tabList: Tab[];
}

const NavigationTab = ({ tabList }: NavigationTabProps) => {
const { pathname } = useLocation();

const isActiveTab = (activePaths: string[]) => activePaths.some((activePath) => pathname.includes(activePath));

return (
<S.NavContainer>
<S.NavList>
{tabList.map((tab, index) => {
return (
<NavItem
key={tab.label}
label={tab.label}
$isSelected={currentTabIndex === index}
onClick={tab.handleTabClick}
/>
);
})}
{tabList.map((tab) => (
<NavItem
key={tab.label}
label={tab.label}
$isActiveTab={isActiveTab(tab.activePathList)}
onClick={tab.handleTabClick}
/>
))}
</S.NavList>
</S.NavContainer>
);
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/components/common/NavigationTab/styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ export const NavContainer = styled.nav`
position: relative;
display: flex;
width: calc(100vw - ${({ theme }) => theme.scrollbarWidth.basic});
height: 4rem;
height: ${({ theme }) => theme.componentHeight.navigationTab};

border-bottom: 0.1rem solid ${({ theme }) => theme.colors.lightGray};
border-bottom: 0.2rem solid ${({ theme }) => theme.colors.lightGray};

${media.small} {
width: calc(100vw - ${({ theme }) => theme.scrollbarWidth.small});
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/layouts/Footer/style.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export const Footer = styled.footer`

background-color: ${({ theme }) => theme.colors.white};

border-top: 0.1rem solid ${({ theme }) => theme.colors.lightGray};
border-top: 0.2rem solid ${({ theme }) => theme.colors.lightGray};

${media.xSmall} {
flex-direction: column;
Expand Down
5 changes: 3 additions & 2 deletions frontend/src/components/layouts/Main/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ import * as S from './styles';

interface MainProps {
isShowBreadCrumb?: boolean;
isShowNavigationTab?: boolean;
}

const Main = ({ children, isShowBreadCrumb }: EssentialPropsWithChildren<MainProps>) => {
const Main = ({ children, isShowBreadCrumb, isShowNavigationTab }: EssentialPropsWithChildren<MainProps>) => {
return (
<S.MainContainer $isShowBreadCrumb={isShowBreadCrumb}>
<S.MainContainer $isShowBreadCrumb={isShowBreadCrumb} $isShowNavigationTab={isShowNavigationTab}>
<S.Contents>{children}</S.Contents>
</S.MainContainer>
);
Expand Down
6 changes: 4 additions & 2 deletions frontend/src/components/layouts/Main/styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ import styled from '@emotion/styled';

interface MainContainerProps {
$isShowBreadCrumb?: boolean;
$isShowNavigationTab?: boolean;
}
const calculateMinHeight = ({ $isShowBreadCrumb, ...theme }: MainContainerProps & Theme) => {
const calculateMinHeight = ({ $isShowBreadCrumb, $isShowNavigationTab, ...theme }: MainContainerProps & Theme) => {
const topbarHeight = theme.componentHeight.topbar;
const footerHeight = theme.componentHeight.footer;
const breadCrumbHeight = $isShowBreadCrumb ? theme.componentHeight.breadCrumb : '0rem';
const navigationTabHeight = $isShowNavigationTab ? theme.componentHeight.navigationTab : '0rem';

return `calc(100vh - ${topbarHeight} - ${footerHeight} - ${breadCrumbHeight})`;
return `calc(100vh - ${topbarHeight} - ${footerHeight} - ${breadCrumbHeight}) - ${navigationTabHeight}`;
};

export const MainContainer = styled.div<MainContainerProps>`
Expand Down
21 changes: 19 additions & 2 deletions frontend/src/components/layouts/PageLayout/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { useLocation } from 'react-router';

import Breadcrumb from '@/components/common/Breadcrumb';
import NavigationTab from '@/components/common/NavigationTab';
import { ROUTE } from '@/constants';
import useBreadcrumbPaths from '@/hooks/useBreadcrumbPaths';
import useNavigationTabs from '@/hooks/useNavigationTabs';
import { EssentialPropsWithChildren } from '@/types';

import Footer from '../Footer';
Expand All @@ -11,16 +16,28 @@ import * as S from './styles';
interface PageLayoutProps {
isNeedBreadCrumb?: boolean;
}

const PageLayout = ({ children, isNeedBreadCrumb = true }: EssentialPropsWithChildren<PageLayoutProps>) => {
// TODO: NavigationTab은 사용자가 홈 페이지와 연결 페이지가 아닌 다른 페이지에서 로그인 상태일 때만 보여준다.
// 임시로 true 설정 (로그인 기능 추가하면서 여기도 수정해야 한다.)
Comment on lines +21 to +22
Copy link
Contributor

Choose a reason for hiding this comment

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

주석 좋아요~~

const isUserLoggedIn = true;

const { pathname } = useLocation();

const breadcrumbPathList = useBreadcrumbPaths();
const isShowBreadCrumb = isNeedBreadCrumb && breadcrumbPathList.length > 1;
const navigationTabList = useNavigationTabs();
const isShowBreadCrumb = !isUserLoggedIn && isNeedBreadCrumb && breadcrumbPathList.length > 1;
const isShowNavigationTab = isUserLoggedIn && pathname !== '/' && !pathname.includes(ROUTE.reviewZone);
Comment on lines +29 to +30
Copy link
Contributor

Choose a reason for hiding this comment

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

렌더링 로직 빡세네요...ㅋㅋㅋㅋㅋ 개발자살려~!


return (
<S.Layout>
<S.Wrapper>
<Topbar />
{isShowNavigationTab && <NavigationTab tabList={navigationTabList} />}
{isShowBreadCrumb && <Breadcrumb pathList={breadcrumbPathList} />}
<Main isShowBreadCrumb={isShowBreadCrumb}>{children}</Main>
<Main isShowBreadCrumb={isShowBreadCrumb} isShowNavigationTab={isShowNavigationTab}>
{children}
</Main>
<Footer />
</S.Wrapper>
</S.Layout>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ export const ReviewInfoContainer = styled.div`
display: flex;
flex-direction: column;
justify-content: flex-end;
margin: 2rem 0 3rem 0;

${media.small} {
margin-bottom: 1rem;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { TopButton, OptionSwitch } from '@/components/common';
import BackButton from '@/components/common/BackButton';
import { ROUTE } from '@/constants';
import { EssentialPropsWithChildren } from '@/types';

import ReviewInfoSection from './components/ReviewInfoSection';
Expand All @@ -13,9 +15,13 @@ interface ReviewDisplayLayoutProps extends EssentialPropsWithChildren {
const ReviewDisplayLayout = ({ isReviewList, children }: ReviewDisplayLayoutProps) => {
const reviewDisplayLayoutOptions = useReviewDisplayLayoutOptions();

// TODO: 임시로 true 설정 (로그인 기능 추가하면서 여기도 수정해야 한다.)
const isUserLoggedIn = true;

return (
<ReviewInfoDataProvider>
<S.ReviewDisplayLayoutContainer>
{isUserLoggedIn && <BackButton prevPath={`/${ROUTE.reviewLinks}`} />}
<S.Container>
<ReviewInfoSection isReviewList={isReviewList} />
<OptionSwitch options={reviewDisplayLayoutOptions} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ export const ReviewDisplayLayoutContainer = styled.div`
flex-direction: column;
width: 90%;
min-height: inherit;

gap: 2rem;

margin: 2rem;
`;

export const Container = styled.div`
Expand All @@ -15,6 +19,7 @@ export const Container = styled.div`
@media screen and (max-width: 530px) {
flex-direction: column;
align-items: flex-start;
margin-bottom: 2.5rem;

margin-bottom: 2rem;
}
`;
7 changes: 5 additions & 2 deletions frontend/src/components/layouts/Topbar/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@ import Logo from './components/Logo';
import * as S from './styles';

const Topbar = () => {
// TODO: 임시로 true 설정 (로그인 기능 추가하면서 여기도 수정해야 한다.)
const isUserLoggedIn = true;
const { pathname } = useLocation();
const $hasNavigationTab = [ROUTE.reviewLinks, ROUTE.writtenReview].includes(pathname);

const isShowNavigationTab = isUserLoggedIn && !['/', ROUTE.reviewZone].includes(pathname);

return (
<S.Layout $hasNavigationTab={$hasNavigationTab}>
<S.Layout $hideBorder={isShowNavigationTab}>
<S.Container>
<UndraggableWrapper>
<Logo />
Expand Down
5 changes: 2 additions & 3 deletions frontend/src/components/layouts/Topbar/styles.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import styled from '@emotion/styled';

export const Layout = styled.section<{ $hasNavigationTab: boolean }>`
export const Layout = styled.section<{ $hideBorder: boolean }>`
z-index: ${({ theme }) => theme.zIndex.topbar};

display: flex;
Expand All @@ -11,8 +11,7 @@ export const Layout = styled.section<{ $hasNavigationTab: boolean }>`
height: ${({ theme }) => theme.componentHeight.topbar};
padding: 2rem 2.5rem;

border-bottom: ${({ theme, $hasNavigationTab }) =>
$hasNavigationTab ? `0.1rem solid ${theme.colors.lightGray}` : 'none'};
border-bottom: ${({ theme, $hideBorder }) => ($hideBorder ? 'none' : `0.1rem solid ${theme.colors.lightGray}`)};
`;

export const Container = styled.div`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@ const TOAST_INFORM = {
};
interface URLGeneratorFormProps {
isMember?: boolean;
handleNewReviewLink?: () => void;
}
const URLGeneratorForm = ({ isMember = false }: URLGeneratorFormProps) => {
const URLGeneratorForm = ({ isMember = false, handleNewReviewLink }: URLGeneratorFormProps) => {
const { revieweeName, projectName, password, isFormValid, resetForm, urlGeneratorStateUpdater } =
useURLGeneratorState({ isMember });

Expand All @@ -48,6 +49,8 @@ const URLGeneratorForm = ({ isMember = false }: URLGeneratorFormProps) => {
const completeReviewZoneURL = getCompleteReviewZoneURL(data.reviewRequestCode);
setReviewZoneURL(completeReviewZoneURL);

handleNewReviewLink?.();

resetForm();

handleOpenToast(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ export const FormContainer = styled.section`
justify-content: center;

width: 40%;
padding: 0px 9rem;

${media.medium} {
width: 45%;
Expand Down
1 change: 1 addition & 0 deletions frontend/src/constants/queryKey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export const REVIEW_QUERY_KEY = {
groupedReviews: 'groupedReviews',
reviewInfoData: 'reviewInfoData',
highlight: 'highlight',
reviewLinks: 'reviewLinks',
};

export const GROUP_QUERY_KEY = {
Expand Down
5 changes: 3 additions & 2 deletions frontend/src/constants/review.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ export const REVIEW_MESSAGE = {
};

export const REVIEW_EMPTY = {
noReviewInTotal: '아직 받은 리뷰가 없어요!',
noReviewInQuestion: '이 질문은 아직 받은 답변이 없어요!',
noReviewInTotal: '아직 받은 리뷰가 없어요...',
noReviewLink: '생성한 리뷰 링크가 없어요...',
noReviewInQuestion: '이 질문은 아직 받은 답변이 없어요...',
};
Comment on lines 12 to 16
Copy link
Contributor

Choose a reason for hiding this comment

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

(원래 있었던 상수긴 하지만) 이 값들을 상수로 관리할 필요가 있을까요?
각 페이지나 컴포넌트에 특화된 값들이고 재사용성도 딱히 고려할 필요 없을 것 같아서 공통 상수로 뺄 필요가 없다는 생각입니다. 또 당장 EmptyContent 컴포넌트도 안내 문구를 string으로만 받지 않고 children으로 받으니까요.

당장 수정하자는 건 아닙니다ㅎㅎ


export const REVIEW_URL_GENERATOR_FORM_VALIDATION = {
Expand Down
Loading
Loading