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

Y_FE_Toy1_Team4 WIKI 서비스 #1

Open
wants to merge 398 commits into
base: main
Choose a base branch
from
Open

Y_FE_Toy1_Team4 WIKI 서비스 #1

wants to merge 398 commits into from

Conversation

gahyuun
Copy link

@gahyuun gahyuun commented Sep 22, 2023

WIKI

Logo

직원들을 위한 WIKI 서비스

개발기간: 2022.09.11 ~ 2022.09.22

WIKI 바로 가기

WIKI repositories 바로가기


🔖 프로젝트 소개

WIKI는 사내 업무 효율성을 극대화하는 종합적인 서비스입니다.

직원들의 업무 시간 체크, 이미지 및 캐러셀을 통한 회사 공지 제공, 개인 캘린더 관리 등 다양한 기능을 통해 원활한 커뮤니케이션과 정보 공유를 지원합니다.


💻 기능 소개

Main

main

메인 페이지의 캐러셀 기능을 react-slick 라이브러리를 사용하여 구현하였습니다. 다양한 커스터마이징을 통해 동적인 캐러셀을 만들었습니다.

react-lottie 라이브러리를 사용해 로티 애니메이션을 만들었고, 사용자에게 조금 더 다양한 경험을 하게 해줄 수 있었습니다.

date-fns를 통한 업무 기록 리스트 렌더링에서도 사용자가 자신이 언제 통근 했는지 수치적으로 더 알기 쉽게 만들었습니다


Modal

commute
타이머 모달을 통해 현재 시간을 출력, 업무 시간 측정, 휴게시간 (정지) 기능을 구현하였습니다

업무 시간은 database에 저장 후 메인 페이지에서 출력합니다


Wiki

wiki

선택한 카테고리에 대해 새롭게 글을 등록하거나, 등록된 글을 수정/삭제할 수 있는 기능을 구현하였습니다.

@uiw/react-md-editor 패키지를 사용해서 작성한 텍스트를 마크다운 양식으로 보여줄 수 있게 구현하였습니다.

페이지 내 네비게이션 바와 컨텐츠 영역의 크기를 해상도에 따라 분기해 반응형 웹 구현을 진행하였습니다.


Gallery

gallery

갤러리 페이지에서 파이어베이스를 사용하여 시간 순으로 사진을 등록/삭제 할 수 있도록 구현하였고, 카테고리 별로 필터링하여 해당 사진들만 보여줍니다.

사진을 업로드할 수 있는 모달창을 구현하였고, 파일 업로드시 선택한 사진의 프리뷰를 미리 볼 수 있습니다.

반응형을 구현하여 기기별로 사용자가 이용하기 편리하게 작업하였습니다.


Calendar

calendar

fullCalendar 라이브러리를 사용하여 개인 캘린더를 구현하였습니다

모달창을 통해 일정 등록이 가능하며 일정 확인과 일정 삭제는 sweetalert를 통해 구현하였습니다

모든 일정은 database에 저장됩니다


Login

image
구글 로그인 기능을 도입하였고 로그인 여부에 따라 페이지 접근 권한을 분기 처리 하였습니다

(백오피스이므로 로그인을 하지 않으면 모든 페이지 접근 불가합니다)



🔨기술 스택

Stack
언어
디자인
서버
라이브러리
협업툴
개발 환경

📘Convention

.github
├── CODEOWNERS
├── PULL_REQUEST_TEMPLATE.md
└── ISSUE_TEMPLATE
    └── docs.md
    └── feat.md
    ...
public
└── images
src
├── apis
├── assets
│	  └── lottieJSON
      └── icons
├── components
│	  └── [componentsName]
│	           └── index.tsx
├── constants
├── hooks
├── pages
│   └── [PageName]
└── styles
│		└── GlobalStyle.tsx
├── types
└── _app.tsx
└── index.tsx
...

🙋‍♀️Contributors

FE: 박가현 FE: 최재훈 FE: 장수빈 FE: 남현준
-모달
-live clock 출력
-업무 시간 기록
-휴게시간(정지) 구현
-로그인 페이지
-소셜 로그인 구현
-페이지 접근 권한
분기처리
-캘린더 페이지
-일정 CRD 구현
-헤더 구현
-wiki 로딩 로직 구현
-gallery로딩 로직 구현
-반응형 구현
-메인페이지
-캐러셀 기능
-작성 시간 계산
-404 페이지 구현
-로딩애니메이션 구현
-반응형 구현
- 갤러리 페이지
-사진 CRD 작업
-업로드 모달 구현
-카테고리 별 필터링
-로딩애니메이션 구현
-반응형 구현
-위키 페이지
- 위키 CRUD 작업
-카테고리 별 필터링
-마크다운 구현
-반응형 구현


🤲느낀 점

가현

  • 타이머, 캘린더 등 평소에 도전해보지 않은 기능들을 구현하게 되었고 이 과정을 통해 많은 것을 배워갔습니다. 이미지를 처리하는 과정이 다소 느려 아쉬움이 남고 추후에 기회가 된다면 이 부분에 대해 개선해보고 싶습니다.

수빈

  • 처음으로 진행해보는 팀 프로젝트였는데 좋은 팀원분들을 만나 깃허브를 사용하여 협업을 어떤 식으로 진행해야 하는지 알게 되었고, 꼼꼼한 코드 리뷰 덕분에 많이 배워갑니다! 🙇🏻‍♀️👏🏻👍

재훈

  • 맡은 기능들을 구현하면서, 라이브러리를 사용하지 않고 직접 구현해보고 싶은 욕구가 생겼고, 저희 팀의 프로젝트 진행과정이 상당히 좋았고, 팀원분들과 같이 소통을 하면서 컨벤션을 제대로 지켜가며 잘 마무리된 프로젝트여서 추후 더 열심히 할 계기가 됐습니다. !

현준

  • 프로젝트를 진행하며 기본적인 내용부터 상황에 따라 어떻게 기능을 구현하는 것이 좋은지 등에 대해 많이 배울 수 있었습니다! 항상 부족한 코드였음에도 매번 꼼꼼하게 코드 리뷰 진행해주시고, 더 좋은 방향으로 개선할 수 있게 도와주셔서 감사드립니다!!

gahyuun and others added 30 commits September 15, 2023 10:29
react-lottie 라이브러리 설치 --force (이용)
Lottie 애니메이션 구현(react-lottie 사용) (size 조절 가능)
[#42] Lottie Animation in MainPage Component
2YH02 added a commit that referenced this pull request Sep 22, 2023
noSPkeepgoing added a commit that referenced this pull request Sep 22, 2023
[feat] firestore내 User데이터 불러오기
Eojoonhyuk added a commit that referenced this pull request Sep 22, 2023
NamgungJongMin added a commit that referenced this pull request Sep 22, 2023
Remove .env file from git repository
Sinary00 pushed a commit that referenced this pull request Sep 22, 2023
공통 요소를 만든다
im-na0 added a commit that referenced this pull request Sep 22, 2023
Feat: Employee 페이지 마크업
TaePoong719 pushed a commit that referenced this pull request Sep 22, 2023
디자인 초안이 나옴에 따른 컴포넌트 관계 설정 및 컴포넌트 레이아웃 재조정 (이슈 #1)
TaePoong719 added a commit that referenced this pull request Sep 22, 2023
Revert "디자인 초안이 나옴에 따른 컴포넌트 관계 설정 및 컴포넌트 레이아웃 재조정 (이슈 #1)"
Copy link

@JIYEONGYANGdev JIYEONGYANGdev left a comment

Choose a reason for hiding this comment

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

필수 구현 + 캘린더(일정 등록 등) 기능으로 완성도 있게 마무리한 것 같아 깔끔하네요.
컴포넌트(파일)도 잘 분리해서 적당한 사이즈(코드라인 수)인 것 같고, 타입이나 스타일컴포넌트 네이밍 등이 다 일관성이 있어 가독성도 너무 좋고요. 타이머 등등 일부 로직 구현도 어렵게 하진 않으신 것 같아보여요.

고생하셨습니다~👍👍👍

  • 이미지 리소스 관리
    이미지 리소스가 무거워서 느렸을 건데요,
    cdn 주소로 활용해서 최적화할 수 있어요.(현업에서 많이 활용. AWS S3+ cloudfront 사용하는 것인데 image cdn에 대해서 검색해서 공부해보시는 것 추천드립니다.)
  • img태그의 width, height 속성을 지정해줘서 실제 사이즈 그대로 가져오는 걸 막을 수도 있고요.
    아니면 imgur같은 곳에 업로드 해서 이미지 주소를 가져다 활용할 수 도 있습니다.

@@ -0,0 +1 @@
* @gahyuun @zoeyourlife @applevalley @wkdtnqls0506

Choose a reason for hiding this comment

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

github 활용을 제대로 하시는군요! 👍

@@ -0,0 +1,11 @@
### ⛳️ Task

Choose a reason for hiding this comment

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

PR 템플릿 너무 좋습니다~ 협업을 위한 준비를 잘하셨군요.

@@ -0,0 +1,8 @@
import { render, screen } from '@testing-library/react';

Choose a reason for hiding this comment

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

위 기본 로고 이미지나, 테스트도 사용하고 있지 않으면 cra생긴 기본 파일들은 제거해도 좋아요~

Comment on lines +34 to +53
<Route
path={ROUTES.MAIN}
element={user ? <Main /> : <Navigate to="/login" />}
></Route>
<Route
path={ROUTES.GALLERY}
element={user ? <Gallery /> : <Navigate to="/login" />}
></Route>
<Route
path={ROUTES.WIKI}
element={user ? <Wiki /> : <Navigate to="/login" />}
></Route>
<Route
path={ROUTES.CALENDAR}
element={user ? <Calendar /> : <Navigate to="/login" />}
></Route>
<Route
path={ROUTES.LOGIN}
element={user ? <Navigate to="/" /> : <Login />}
/>

Choose a reason for hiding this comment

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

토이 진행중 멘토링 시간때 로그인 관련 질문을 주셨었었죠~

모든 라우트에서 element에서 분기처리하는 것보다

최상위에서 (path가 바뀔때마다) 한번씩만 검사하도록 하면 편할 것 같아요. 코드 수도 그렇고요.

로그인여부만 검사하는 컴포넌트를 훅처럼 사용할 수 있을 것 같습니다.
예시

const CheckUser = () => {

  useEffect(() => {
    if (localStorage.getItem(AUTH_KEY.accessToken)) {
       // 특정 페이지로 간다던지
	  else {
       // refreshToken 을 받아온다든지

    }
  }, [ // location path])


return null

}


// Main.tsx

funcion Main () {

  return (
    ..

    <CheckUser/>
)

Comment on lines +16 to +27
interface ICalendarData {
content: string;
startDate: string;
endDate: string;
}

interface ICalendarResponse {
start: Date;
end: Date;
title: string;
id: string;
}

Choose a reason for hiding this comment

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

타입명 규칙도 정확하네요! 저는 CalendarDataType / 컴포넌트 props인 경우 CalendarProps 이런식으로 정의하기도 합니다.
interface인 경우 I, type인 경우 T를 반드시 붙여야하는 건 아니지만 이렇게 하면 구분이 좋긴 한 것 같네요~

Comment on lines +27 to +41
const clickRunButton = () => {
setIsRunning(!isRunning);
};
const clickFinishButton = () => {
setIsFinishing(true);
setIsRunning(!isRunning);
};
const clickOkayButton = () => {
setShowModal(false);
setWorkTime(WORK_TIME_INITIAL_VALUE);
setIsRunning(false);
setIsFinishing(false);
setIsStopping(false);
addWorkTimeData(workTime);
};

Choose a reason for hiding this comment

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

상태값이 많아 헷갈렸을 수도 있겠네요.

혹시 isRunning <-> isFinishing <-> isStopping 간에 서로 동작 트리거가 되거나 연쇄성이 있는 부분은 없을까요?
만약 서로 dependency가 있다면 useCallback 등을 적절히 사용해야 할 수도 있을 것 같아요. (없다면 문제없고요)

Comment on lines +77 to +81
<StyledCommuteMenu
onClick={() => {
setShowModal(true);
}}
>

Choose a reason for hiding this comment

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

코드 한 줄의 printWidth를 얼마로 정해두었나요? 보통 148~160 대 정도는 충분한 것 같아요. 일부러 하신 거라면 상관없습니다.

파일 내 코드라인이 길어지면 보기 힘들 수도 있으니까요.

 <StyledCommuteMenu  onClick={() =>  setShowModal(true)}>

이렇게 한줄로도 충분한 것 같아요 이정도는.

</StyledCustomModal>
</>
);
}

Choose a reason for hiding this comment

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

스크린샷 2023-09-29 오후 1 31 50

사용자관점에서 의견인데요!

stop이라는 버튼이 타이머 옆에 있어서, 이 스탑 버튼을 누르면 마치 시간이 멈춰야할 것 같은 인상이 들어서요.
밑에 퇴근 버튼 쪽에 있는 게 더 인지하기 쉬운 것 같아요!

@@ -0,0 +1,15 @@
export const CALENDAR_TITLE = '님의 캘린더';

Choose a reason for hiding this comment

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

꼼꼼한 상수 활용 너무 좋습니다. 효율적인 코딩/유지보수 등에 있어서 가장 중요한 부분 같아요.

}

function WikiCreate({ setIsEdit, selectedCategory, data }: createProps) {
const isCreate = data === undefined;

Choose a reason for hiding this comment

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

내려온 data 가 없을 때 "생성" 이다, 라는 의미인거죠?
이런 플래그 값을 만들때는 memoization을 하면 좋습니다.(성능면)

Suggested change
const isCreate = data === undefined;
import isNil from 'lodash/isNil'
const isCreateMode = useMemo(() => isNil(data), [data]);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants