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

Feat: (어드민) 게시물 생성 페이지 및 기능 구현 #276

Merged
merged 37 commits into from
Nov 26, 2024

Conversation

ParkSohyunee
Copy link
Contributor

@ParkSohyunee ParkSohyunee commented Nov 21, 2024

개요

  • 어드민 기능 중 게시물 생성 페이지를 구현했습니다.
  • 카테고리, 제목, 소개, 내용을 작성할 수 있는 게시물 생성 기능을 완성했습니다.

작업 사항

  • 게시물 생성 기능 구현
    • react-hook-form을 사용한 form 관리
  • 게시물 종류에 따른 카테고리(소식, 이벤트, 팁) 조회 API 연동
  • 게시물 내용 작성 시 블록 삽입 형태로 구현
    • 내용은 총 6가지 타입(소제목, 본문, 버튼, 이미지, 구분선, 유의)을 블록으로 추가할 수 있음
    • 각 블록을 삭제할 수 있음
  • 내용 중 '본문'을 마크다운 형식으로 구현
  • 내용 중 '이미지' 업로드 방식으로 pre-signed url을 이용해서 s3에 직접 업로드 하는 방식으로 구현
    • 해당 기능을 구현하면서 pre-signed url에 대해 블로그✏️ 로 정리해 보았습니다. 개념, 구현 방식등에 도움이 될 수 있을 것 같아서 참고 부탁드립니다.
  • 게시물 생성 페이지 UI 구현
    • 기존 서비스는 모바일에 최적화 하기위해 max-width가 430으로 되어있지만, 어드민 페이지는 전체 넓이를 사용하도록 글로벌 스타일 수정

참고 사항

마크다운 라이브러리 선택 이유

마크다운 라이브러리로 다음과 같이 3개의 라이브러리를 검토했습니다. 그 중 가볍고, 현재도 꾸준히 업데이트 되고있고, next.js와 호환이 잘되고, 필요로한 기능 추가 플러그인 설치 없이 사용할 수 있는 @uiw/react-md-editor를 선택했습니다.

  • 후보1. @uiw/react-md-editor (선택)
    • React 기반 Markdown 에디터로 미리보기와 Markdown 편집을 동시에 지원하며, 심플하고 경량화된 인터페이스를 제공합니다.
    • 특징 : 미리보기 기능 지원, (코드)하이라이트 기능 지원, Next.js 지원, 현재도 꾸준히 업데이트, 4.25MB (크기)
  • 후보2. react-markdown
    • Markdown을 React 컴포넌트로 렌더링하는 라이브러리입니다.
    • 특징 : 매우 가볍고 기본적인 Markdown 렌더링에 적합합니다. 하이라이트 기능 등 추가 플러그인과 함께 사용할 수 있습니다.
  • 후보3. @mantine/tiptap
    • Mantine의 Tiptap 기반 Rich Text Editor
    • 특징 : UI가 깔끔함, 마크다운 자체를 지원하지는 않지만 추가 플러그인을 통해 변환 가능, text hilight기능이 있음, 하지만 react-markdown 과 용량이 7배 차이 (다운로드 수는 10배 차이)
    • 용량이 너무 커서 포기했는데, 나중에 위지위그 에디터 기능을 메인으로 개발하고 싶을 때 사용해보면 좋을 것 같습니다. 👀

후속 작업

  • 콘텐츠 블록에 드래그 앤 드롭 기능 추가

관련 이슈

  • 어드민 페이지가 웹에 최적화된 기능이다 보니 기존 글로벌 스타일에서 배경, 넓이(430px) 고정된 부분을 제거하여, 다른 페이지에 스타일 수정이 필요합니다. 이 부분은 다른 브랜치로 작업 중입니다.
  • 위 작업분이 생각보다 페이지 수정이 많아, 브랜치를 분리하느라 현재 브랜치에서 Revert 커밋이 발생했습니다. 추후에는 주의해서 작업하겠습니다.
  • 빌드 중 react-lottie 패키지 관련 이슈로 인해 에러가 발생하여 @babel/runtime 라이브러리를 추가 설치하게 되었습니다.

스크린샷

image

image

image


리뷰어에게

  • 어드민 페이지 디자인은 임의로 깔끔한 느낌으로 퍼블리싱 했으며, UI/UX 부분은 상세히 적용하지 않았습니다. (모달, 토스트메세지 등)
  • 게시물 생성에 Default로 필요한 필드(제목, 소개, 카테고리)외에는 유효성 검사를 적용하지 않았습니다.
  • 마크다운 라이브러리가 추가됨에 따라 pull 받으시고, yarn install로 설치 부탁드립니다.

긴 PR 읽어 주셔서 감사합니다. 💕


# Conflicts:
#	src/lib/constants/formInputValidationRules.ts
#	yarn.lock
Copy link

vercel bot commented Nov 21, 2024

@ParkSohyunee is attempting to deploy a commit to the Eujin Ahn's projects Team on Vercel.

A member of the Team first needs to authorize it.

{item.type === 'notice' && <p className={styles.articleNotice}>{item.description}</p>}
{item.type === 'note' && <textarea value={item.description} readOnly className={styles.articleNotice} />}
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@Nahyun-Kang 나현님, 공지 조회 컴포넌트에서 유의사항 카테고리가 'note'로 표기됨에 따라 관련 타입을 수정 및 textarea로 보여주도록 수정한 점 참고 부탁드립니다. 👀

Copy link
Contributor

Choose a reason for hiding this comment

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

오오, textarea를 이렇게도 사용할 수 있군요! 줄바꿈을 위해 p블록 대신 textarea readOnly 사용!! 배워갑니다!🤔

Copy link
Contributor

Choose a reason for hiding this comment

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

@Nahyun-Kang 나현님, 공지 조회 컴포넌트에서 유의사항 카테고리가 'note'로 표기됨에 따라 관련 타입을 수정 및 textarea로 보여주도록 수정한 점 참고 부탁드립니다. 👀

소현님! note로 타입 변경된 점 확인했습니다! 노티 감사합니다!!🙇‍♀️

Comment on lines 51 to 58
export interface NoticeContentType {
type: string;
description: string;
imageUrl: string;
buttonName: string;
buttonLink: string;
[key: string]: unknown;
type: NoticeContentsType;
description?: string;
imageUrl?: unknown; // FileList 타입일수도, String 타입일수도, undefined일수도 있으므로 사용처에서 타입 지정
buttonName?: string;
buttonLink?: string;
}
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@Nahyun-Kang 나현님, 공지 콘텐츠 타입을 공지 생성과 조회 모두에서 사용될 수 있도록 수정했습니다. 더불어, 카테고리 타입도 함께 작성해 두어 참고 부탁드립니당 👀

Copy link
Contributor

Choose a reason for hiding this comment

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

타입 조회에서도 공통으로 쓸 수 있게 작성해주셔서 감사합니다! NoticeContentType으로 불러와서 쓸 수 있도록 하겠습니당!👍👍

Copy link
Contributor

@seoyoung-min seoyoung-min left a comment

Choose a reason for hiding this comment

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

LGGGGTM!! 소현님, 컴포넌트 수가 어마어마 하네요🥹
아예 새로운 어드민 파트에서, 또 복잡한 게시물 생성을 맡아주셔서 감사합니다...!
기획하면서도 이게 맞나 싶었는데, 기획안을 그대로 반영해주셔서 정말 감사해요🙇‍♀️✨

{item.type === 'notice' && <p className={styles.articleNotice}>{item.description}</p>}
{item.type === 'note' && <textarea value={item.description} readOnly className={styles.articleNotice} />}
Copy link
Contributor

Choose a reason for hiding this comment

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

오오, textarea를 이렇게도 사용할 수 있군요! 줄바꿈을 위해 p블록 대신 textarea readOnly 사용!! 배워갑니다!🤔

@Nahyun-Kang
Copy link
Contributor

와 소현님 공지 생성 부분을 이렇게 만들어주시다니.. 너무 멋져요..🥹 남겨주신 코멘트도 확인해보았습니다! 너무 LGTM!

@ParkSohyunee ParkSohyunee merged commit 10033fc into 8-Sprinters:dev Nov 26, 2024
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Design UI 수정 Feat 구현
Projects
None yet
Development

Successfully merging this pull request may close these issues.

react-lottie 라이브러리 babel-runtime 업데이트에 따른 빌드 에러
3 participants