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

공지사항 목록 컴포넌트 / 공지사항 상세 컴포넌트 UI 구현 / 공지사항 ROUTER 설정 #749

Merged
merged 21 commits into from
Oct 18, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7a9a4a4
feat: (#741) 모바일 버전 공지사항 목록 구현
Gilpop8663 Oct 13, 2023
7f841f3
feat: (#741) PC 버전 공지사항 리스트 스타일 구현
Gilpop8663 Oct 13, 2023
efc71a3
feat: (#741) 공지사항 세부 내용 컴포넌트 구현
Gilpop8663 Oct 15, 2023
b69cf4b
feat: 공지사항 리스트 페이지 구현
Gilpop8663 Oct 15, 2023
de57115
feat: (#741) 공지사항 세부 페이지 구현
Gilpop8663 Oct 15, 2023
962d1ae
feat: (#741) 공지사항 목록, 상세 페이지 router 설정
Gilpop8663 Oct 15, 2023
5b1f7f9
feat: (#741) 공지사항 웹 접근성 개선
Gilpop8663 Oct 15, 2023
6118863
style: (#741) 공지사항 목록에서는 채널톡 안보이도록 설정 및 padding 속성 설정
Gilpop8663 Oct 15, 2023
94de948
style: (#741) 공지사항 목록 ...이 짧게 설정되어서 width 값 재설정
Gilpop8663 Oct 15, 2023
3c60fa1
chore: (#741) 디자인 변경으로 인한 공지사항 보러가기 삭제
Gilpop8663 Oct 16, 2023
4795a40
Merge branch 'dev' of https://github.com/woowacourse-teams/2023-votog…
Gilpop8663 Oct 17, 2023
98375d0
refactor: (#741) 홈과 공지사항 목록 url을 PATH로 변경
Gilpop8663 Oct 17, 2023
4000618
refactor :(#741) 공지사항 목록을 감싸는 부모를 div에서 main으로 변경
Gilpop8663 Oct 17, 2023
bb9881b
refactor: (#741) 날짜를 string에서 StringDate로 타입 변경
Gilpop8663 Oct 17, 2023
0f730f9
style: (#741) 데스크탑일때 홈으로 버튼 안보이도록 설정
Gilpop8663 Oct 17, 2023
9ce18cd
chore: (#741) 읽은 사람에게 혼동을 주는 주석 제거
Gilpop8663 Oct 17, 2023
41aec0a
chore: (#741) router의 :id를 :noticeId로 이름 변경
Gilpop8663 Oct 17, 2023
284b2e1
refactor: (#741) StringDateOnly 타입 추가 및 api에서 생성 날짜를 변환시켜 날짜만 존재하도록 수정
Gilpop8663 Oct 17, 2023
60464df
refactor: (#741) Response를 Omit하여 만든 타입의 가독성을 높이기 위해 Response 타입을 이동
Gilpop8663 Oct 17, 2023
fd69f50
refactor: (#741) StringDateOnly Type 이름 변경
Gilpop8663 Oct 18, 2023
4d83d1a
chore: (#741) dev 브런치와 충돌 해결
Gilpop8663 Oct 18, 2023
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
7 changes: 7 additions & 0 deletions frontend/__test__/api/notice.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,13 @@ describe('서버와 통신하여 공지사항 관련된 api를 통신할 수 있
expect(result).toEqual(MOCK_TRANSFORM_NOTICE);
});

test('공지 사항의 createdAt을 날짜만 받도록 변환시킨다.', async () => {
const createdAt = '2023-08-19 08:23';
const result = '2023-08-19';

expect(createdAt.split(' ')[0]).toBe(result);
});

test('공지 사항을 수정한다.', async () => {
const data: NoticeRequest = {
title: '아이폰입니다',
Expand Down
21 changes: 16 additions & 5 deletions frontend/src/api/notice.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Notice, NoticeList } from '@type/notice';
import { StringDate, StringDateOnly } from '@type/time';

import { deleteFetch, getFetch, patchFetch, postFetch } from '@utils/fetch';

Expand All @@ -10,22 +11,32 @@ export const transformNotice = ({
deadline,
bannerTitle,
bannerSubtitle,
}: Notice): Notice => {
}: NoticeResponse): Notice => {
return {
id,
title,
content,
createdAt,
createdAt: createdAt.split(' ')[0] as StringDateOnly,
deadline,
bannerTitle,
bannerSubtitle,
};
};

export interface NoticeResponse {
id: number;
title: string;
content: string;
createdAt: StringDate;
deadline: StringDate;
bannerTitle: string;
bannerSubtitle: string;
}

export interface NoticeListResponse {
totalPageNumber: number;
currentPageNumber: number;
notices: Notice[];
notices: NoticeResponse[];
}

export type NoticeRequest = Omit<Notice, 'createdAt' | 'id'>;
Expand All @@ -37,7 +48,7 @@ export const createNotice = async (notice: NoticeRequest) => {
};

export const getBannerNotice = async () => {
const bannerNotice = await getFetch<Notice>(`${BASE_URL}/notices/progress`);
const bannerNotice = await getFetch<NoticeResponse>(`${BASE_URL}/notices/progress`);

return transformNotice(bannerNotice);
};
Expand All @@ -53,7 +64,7 @@ export const getNoticeList = async (page: number): Promise<NoticeList> => {
};

export const getNoticeDetail = async (noticeId: number) => {
const noticeDetail = await getFetch<Notice>(`${BASE_URL}/notices/${noticeId}`);
const noticeDetail = await getFetch<NoticeResponse>(`${BASE_URL}/notices/${noticeId}`);

return transformNotice(noticeDetail);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ export default meta;
type Story = StoryObj<typeof NoticeDetail>;

export const Default: Story = {
render: () => <NoticeDetail {...MOCK_TRANSFORM_NOTICE} />,
render: () => <NoticeDetail notice={MOCK_TRANSFORM_NOTICE} />,
};
11 changes: 4 additions & 7 deletions frontend/src/components/notice/NoticeDetail/index.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useNavigate } from 'react-router-dom';

import { StringDate } from '@type/time';
import { Notice } from '@type/notice';

import SquareButton from '@components/common/SquareButton';

Expand All @@ -9,20 +9,17 @@ import { PATH } from '@constants/path';
import * as S from './style';

interface NoticeDetailProps {
title: string;
content: string;
createdAt: StringDate;
notice: Notice;
}

export default function NoticeDetail({ title, content, createdAt }: NoticeDetailProps) {
export default function NoticeDetail({ notice: { title, content, createdAt } }: NoticeDetailProps) {
const navigate = useNavigate();
const createdDate = createdAt.slice(0, 10);

return (
<S.Container>
<S.Category tabIndex={0}>VoTogether 공지사항</S.Category>
<S.Title tabIndex={0}>{title}</S.Title>
<S.CreatedAt tabIndex={0}>작성일 : {createdDate}</S.CreatedAt>
<S.CreatedAt tabIndex={0}>작성일 : {createdAt}</S.CreatedAt>
<S.Content tabIndex={0}>{content}</S.Content>
<S.ButtonContainer>
<S.ButtonWrapper>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ export default meta;
type Story = StoryObj<typeof NoticeItem>;

export const Default: Story = {
render: () => <NoticeItem {...MOCK_TRANSFORM_NOTICE} />,
render: () => <NoticeItem notice={MOCK_TRANSFORM_NOTICE} />,
};
12 changes: 4 additions & 8 deletions frontend/src/components/notice/NoticeList/NoticeItem/index.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,18 @@
import { StringDate } from '@type/time';
import { Notice } from '@type/notice';

import { PATH } from '@constants/path';

import * as S from './style';

interface NoticeItemProps {
id: number;
title: string;
createdAt: StringDate;
notice: Notice;
}
export default function NoticeItem({ id, title, createdAt }: NoticeItemProps) {
const createdDate = createdAt.slice(0, 10);

export default function NoticeItem({ notice: { id, title, createdAt } }: NoticeItemProps) {
return (
<S.Container>
<S.DetailLink to={`${PATH.NOTICES}/${id}`}>
<S.Title>{title}</S.Title>
<S.CreatedAt>{createdDate}</S.CreatedAt>
<S.CreatedAt>{createdAt}</S.CreatedAt>
</S.DetailLink>
</S.Container>
);
Expand Down
10 changes: 3 additions & 7 deletions frontend/src/components/notice/NoticeList/index.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,17 @@
import { StringDate } from '@type/time';
import { Notice } from '@type/notice';

import NoticeItem from './NoticeItem';
import * as S from './style';

interface NoticeListProps {
noticeList: {
id: number;
title: string;
createdAt: StringDate;
}[];
noticeList: Notice[];
}

export default function NoticeList({ noticeList }: NoticeListProps) {
return (
<S.Container>
{noticeList.map(notice => (
<NoticeItem key={notice.id} {...notice} />
<NoticeItem key={notice.id} notice={notice} />
))}
</S.Container>
);
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/mocks/mockData/notice.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Notice, NoticeList } from '@type/notice';
import { StringDate } from '@type/time';

import { NoticeListResponse, transformNotice } from '@api/notice';
import { NoticeListResponse, NoticeResponse, transformNotice } from '@api/notice';

const noticeTitleList = [
'방방뛰는 코끼리',
Expand Down Expand Up @@ -54,7 +54,7 @@ const noticeDeadlineList: StringDate[] = [
'2023-10-11 12:23',
];

const getMockNoticeResponse = (): Notice => ({
const getMockNoticeResponse = (): NoticeResponse => ({
id: Math.floor(Math.random() * 30),
title: noticeTitleList[Math.floor(Math.random() * 8)],
content: noticeContentList[Math.floor(Math.random() * 11)],
Expand All @@ -64,7 +64,7 @@ const getMockNoticeResponse = (): Notice => ({
deadline: noticeDeadlineList[Math.floor(Math.random() * 9)],
});

export const MOCK_NOTICE_RESPONSE: Notice = getMockNoticeResponse();
export const MOCK_NOTICE_RESPONSE: NoticeResponse = getMockNoticeResponse();

export const MOCK_TRANSFORM_NOTICE: Notice = transformNotice(MOCK_NOTICE_RESPONSE);

Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/notice/NoticeDetailPage/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export default function NoticeDetailPage() {
return (
<Layout isSidebarVisible>
<S.Container>
<NoticeDetail {...MOCK_TRANSFORM_NOTICE} />
<NoticeDetail notice={MOCK_TRANSFORM_NOTICE} />
</S.Container>
</Layout>
);
Expand Down
14 changes: 3 additions & 11 deletions frontend/src/types/notice.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,7 @@
import { NoticeListResponse } from '@api/notice';
import { NoticeListResponse, NoticeResponse } from '@api/notice';

import { StringDate } from './time';
import { StringDateOnly } from './time';

export interface Notice {
id: number;
title: string;
content: string;
createdAt: StringDate;
deadline: StringDate;
bannerTitle: string;
bannerSubtitle: string;
}
export type Notice = Omit<NoticeResponse, 'createdAt'> & { createdAt: StringDateOnly };

export type NoticeList = Omit<NoticeListResponse, 'notices'> & { noticeList: Notice[] };
8 changes: 8 additions & 0 deletions frontend/src/types/time.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,12 @@ export interface DHMTime {
minute: number;
}

/**
* yyyy-mm-dd HH-MM
*/
export type StringDate = `${number}-${number}-${number} ${number}:${number}`;

/**
* yyyy-mm-dd
*/
export type StringDateOnly = `${number}-${number}-${number}`;
Copy link
Member

Choose a reason for hiding this comment

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

day까지만 포함시키겠다는 의미로
StringDateUpToDay 어떠신가요? (gpt의 도움을 받았습니다)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

더 명확하게 표현되는 것 같아 반영했습니다~

Loading