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

[Mission4/김유리] - Project_Notion_VanillaJS #17

Open
wants to merge 41 commits into
base: 3/#4_kimyuri
Choose a base branch
from

Conversation

glassk
Copy link
Member

@glassk glassk commented Nov 16, 2022

📌 과제 설명

VanillaJS로 노션(Notion)을 클로닝했습니다.

배포: https://yuri-notion.vercel.app

실행 방법

  1. /src/utils에 key.js 파일을 생성하고 API_END_POINT 값을 설정합니다.
  2. 루트 디렉토리에서 터미널로 npm start 또는 npx serve -s를 실행합니다.

디렉토리 구조

👩‍💻 요구 사항과 구현 내용

  • 화면 좌측에 루트 Documents를 불러오는 API를 통해 루트 Documents를 렌더링합니다.
    • 루트 Document를 클릭하면 오른쪽 편집기 영역에 해당 Document를 렌더링합니다.
    • 해당 루트 Document에 하위 Document가 있는 경우 해당 Document 아래에 트리 형태로 렌더링합니다.
    • Document Tree에서 각 Document 우측의 + 버튼을 클릭하면, 클릭한 Document의 하위 Document로 새 Document를 생성하고 편집화면으로 넘깁니다.
    • 열린 Document 목록의 documentId를 localStorage에 저장하여 새로고침해도 열린 상태를 유지합니다.
    • 현재 접속 중인 Document를 하이라이트합니다.
    • 루트 Documents나 Sidebar 하단의 버튼을 클릭하여 루트 Document를 추가합니다.
    • Document 제목이 긴 경우 생략 처리(...)합니다.
  • Document Save API를 이용해 지속적으로 서버에 저장합니다.
    • Document의 제목을 수정하면 Sidebar와 Document.title에 반영됩니다.
  • History API를 이용해 SPA 형태로 만듭니다.
    • 루트 URL 접속 시 별도의 편집기를 선택하지 않습니다.
    • /documents/{documentId} 로 접속 시 해당 Document를 불러와 편집기에 로딩합니다.
      • 존재하지 않는 documentId로 접속 시 첫 Document를 렌더링합니다.
  • 편집기 최하단에는 현재 편집 중인 Document의 하위 Document를 렌더링합니다.
  • 삭제(휴지통) 버튼을 클릭하면 Document를 삭제합니다.
    • 현재 편집 중인 Document를 삭제하면 첫 Document를 렌더링하고 Document Tree를 변화합니다.
    • 현재 편집 중이 아닌 Document를 삭제하면 Document Tree만 변화합니다.

루트 Document 추가 및 수정

하위 Document 추가 및 수정

Document 삭제

존재하지 않은 Document 접속

현재 편집 중인 Document의 하위 Document 렌더링

✅ PR 포인트 & 궁금한 점

  • UI에 신경쓰다보니 state나 이벤트 핸들러를 전달하는 방식에 대해 좀 더 깊이 고민하지 못한 것 같습니다. Sidebar와 DocumentEditPage 컴포넌트에서 포함하는 하위 컴포넌트들의 state를 동시에 제어하려다보니(e.g. Editor에서 Document의 제목을 수정하면 DocumentList에도 반영되게 하기) App에 이벤트 핸들러를 구현하게 됐습니다. 😢 여러 방법이 있을 것 같은데 적절한 방법을 생각해내기 어려웠습니다..!
  • 코드가 중복되거나 흐름을 단번에 이해하기 어려운 부분이 있는데 어떻게 분리하고 파일 구조를 세팅하면 좋을지 궁금합니다.

* Sidebar 내부에서 DocumentList 렌더링
* new 없이 생성한 경우에 대한 방어코드 작성
* util 함수(api, router, constants, helper) 추가
* storage util 함수 추가
* Page와 Editor 컴포넌트 분리
* localStorage에 document id 임시 저장
* reset.css 설정
* 문서 추가 버튼의 텍스트를 아이콘으로 대체
* Sidebar, DocumentList, Editor 컴포넌트에 적용
* request(url, options) -> fetchDocuments(documentId, options)
* contants -> constants 오타 수정
* DocumentList 항목 열기/닫기 토글 처리(localStorage에 저장)
* 문서 제목 클릭 시 해당 문서 편집 화면 렌더링
* + 버튼 클릭 시 하위 문서 추가
* 삭제 버튼 클릭 시 해당 문서 삭제
* Sidebar에서 DocumentAddButton 컴포넌트 렌더링
* state 할당 방식 수정
* localStorage value 숫자형으로 통일
* mouseover, mouseout 이벤트에 문서 제목 요소 반영
* 하위 컴포넌트들끼리 전달하던 핸들러를 App에서 관리하도록 변경
* 핸들러: 추가(onAdd), 삭제(onDelete), 수정(onEdit)
* 표현 변경: remove -> delete, editing -> edit
* 현재 편집 중인 문서의 하위 문서 링크 렌더링
* 존재하지 않는 페이지이면 alert, 첫 문서로 라우팅
* SidebarHeader 컴포넌트 구현(워크스페이스 이름)
* DocumentList 스크롤바 추가
* 선택된 문서의 제목 굵게, 배경색 어둡게 처리
* opened_item => opened_items
* title 프로퍼티 설정
* title이 문자열인지 검사
* UNTITLED 또는 title 리턴
* Sidebar에서 렌더링한 DocumentAddButton을 DocumentList에서 렌더링하도록 변경
Copy link
Member

@minjongbaek minjongbaek left a comment

Choose a reason for hiding this comment

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

안녕하세요 유리님, 과제 수행하느라 고생하셨습니다~ 👏
코드에 일관성이 있고, 인덴트 수를 줄이려고 고민을 하신 것 같아요! 덕분에 리뷰가 수월했던 것 같습니다 👍
고민 중이신 UX 관련 이슈를 해결 할 수 있는 방법을 코멘트에 작성해두었습니다!

+) 스타일링 깔끔하게 잘하신 것 같아요!

src/styles/style.css Show resolved Hide resolved
src/components/App.js Outdated Show resolved Hide resolved
src/components/Sidebar/DocumentList.js Outdated Show resolved Hide resolved
onAdd,
});

this.render = async () => {
Copy link
Member

Choose a reason for hiding this comment

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

p4;
다른 컴포넌트들 처럼 현재 상태를 기반으로 렌더링하게끔 수정하는 것도 좋을 것 같아요!

src/components/Sidebar/DocumentAddButton.js Show resolved Hide resolved
src/components/DocumentEditPage/DocumentEditPage.js Outdated Show resolved Hide resolved
src/components/App.js Outdated Show resolved Hide resolved
Copy link

@Park-min-hyoung Park-min-hyoung left a comment

Choose a reason for hiding this comment

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

유리님 과제 하시느라 수고하셨습니다~ 정말 하나하나 세심하게 코드 작성하신 것 보고 놀랐네요..
많이 배워갑니다!!! 👍

src/components/App.js Outdated Show resolved Hide resolved
src/components/App.js Outdated Show resolved Hide resolved
src/utils/constants.js Outdated Show resolved Hide resolved
src/components/DocumentEditPage/DocumentHeader.js Outdated Show resolved Hide resolved
* install parcel
@glassk glassk closed this Nov 24, 2022
@glassk glassk deleted the 3/#4_kimyuri_working branch November 24, 2022 04:05
@glassk glassk restored the 3/#4_kimyuri_working branch November 24, 2022 04:43
@glassk glassk reopened this Nov 24, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants