|
| 1 | +<h1 align="center">Taskify</h1> |
| 2 | +<p align="center">협업과 일정 관리를 한 번에! 직관적인 대시보드 서비스</p> |
| 3 | + |
1 | 4 | <div style="text-align: center;"> |
2 | 5 | <a href="https://taskify-theta-plum.vercel.app/"> |
3 | | - <img alt="Taskify" src='public/images/landing_hero.png' width="350" height="200"> |
| 6 | + <img alt="Taskify" src='public/images/landing_hero.png' width="auto" height="auto"> |
4 | 7 | </a> |
5 | 8 | </div> |
| 9 | +<p style="text-align: center;"> |
| 10 | +- 개발 기간 : 25.03.18 ~ 25.04.04<br> |
| 11 | +- 리팩토링 : 25.04.08 ~ 25.04.15 |
| 12 | +</p> |
| 13 | + |
| 14 | +# 🗓️ Taskify는? |
6 | 15 |
|
7 | | -- Taskify 일정관리 서비스 |
8 | | -- 개발 기간 : 25.03.18 ~ 25.04.04 |
| 16 | +카드를 등록해 일정을 관리할 수 있는 그룹 대시보드예요!<br> |
| 17 | +멤버를 초대해 일정을 공유하고 협업을 관리해 보세요!<br> |
| 18 | +정식 프로젝트 기간 종료 후 리팩토링을 진행하며 직접 이용했어요. |
9 | 19 |
|
10 | | -# Team |
| 20 | +# 🤝 Team |
11 | 21 |
|
12 | 22 | ### 황혜진 |
13 | 23 |
|
14 | | -- 팀장 |
15 | | -- 공통 컴포넌트 Button, Modal을 크기 및 버튼 개수 설정 등 유동적인 UI로 구성 |
16 | | -- 주요 컴포넌트 작성: Card, CardList, Column |
17 | | -- CardList, Column의 스크롤 바닥 감지를 통한 무한 스크롤 기능 구현 |
18 | | -- [dashboardId]index에서 칼럼 및 카드 데이터 동적 렌더링 |
19 | | -- 카드 생성 / 삭제 / 상세조회 기능을 포함한 모달 기반 UI 작성 (AddColumnModal, ColumnDeleteModal, ColumnManageModal) |
20 | | -- 프로젝트 초기 컨벤션(파일명, 커밋 메시지, 브랜치 네이밍 등) 설정 및 팀 내 공유 |
| 24 | +**팀장** |
| 25 | + |
| 26 | +1. **공통 컴포넌트** |
| 27 | + |
| 28 | +- `Button`, `Modal`을 크기 및 버튼 개수 설정 등 유동적인 UI로 구성 |
| 29 | +- `Card`, `CardList`, `Column` 작성 |
| 30 | +- `CardList`, `Column`의 스크롤 바닥 감지를 통한 무한 스크롤 기능 구현 |
| 31 | +- 카드 생성 / 삭제 / 상세조회 기능을 포함한 모달 기반 UI 작성 (`AddColumnModal`, `ColumnDeleteModal`, `ColumnManageModal`) |
| 32 | + |
| 33 | +2. **페이지** |
| 34 | + |
| 35 | +- `[dashboardId]index`에서 칼럼 및 카드 데이터 동적 렌더링 |
21 | 36 |
|
| 37 | +3. **기타 기여 사항** |
| 38 | + |
| 39 | +- 프로젝트 초기 컨벤션(파일명, 커밋 메시지, 브랜치 네이밍 등) 설정 및 팀 내 공유 |
22 | 40 |
|
23 | 41 | ### 임용균 |
24 | 42 |
|
25 | | -- 프로젝트 세팅 |
26 | | -- 컴포넌트 작성 Input, SideMenu, TodoModal, TaskModal |
27 | | -- 페이지 작성 landing, MyDashboard |
28 | | -- SideMenu 접기/펴기 기능 및 반응형 |
| 43 | +1. **공통 컴포넌트** |
| 44 | + |
| 45 | +- `Input`, `SideMenu`, `TodoModal`, `TaskModal` |
| 46 | +- `SideMenu` 접기/펴기 기능 및 반응형 |
| 47 | +- `TodoModal`, `TaskModal` Api 연동 및 업로드 기능 구현 |
| 48 | + |
| 49 | +2. **페이지** |
| 50 | + |
| 51 | +- `landing`, `MyDashboard` |
29 | 52 | - MyDashboard Page 검색어 기반 필터링 및 페이지네이션 연동 |
30 | | -- TodoModal, TaskModal Api 연동 및 업로드 기능 구현 |
| 53 | +- `MydashBoardPage` D&D 적용 |
| 54 | +- `dexie` 를 활용하여 DB를 생성하여 D&D로 대시보드의 순서변경을 저장 |
31 | 55 |
|
| 56 | +3. **로직 분리 및 성능 개선** |
| 57 | + |
| 58 | +- `useDashboardDragHandler` 커스텀 훅으로 `handleDragEnd` 로직 분리 |
| 59 | +- `MydashBoardPage` 검색 필터링 useMemo최적화, 대시보드 리스트 필터링 useMemo 적용 |
| 60 | +- `CardDetailModal` 상태 분리 및 로직분리, `useCardDetailState`, `useCardDetail` 상태분리 및 로직분리 |
| 61 | +- `SideMenu` 페이지네이션`usePagination` 로직분리 및 `DashboardItem`로 사이드 메뉴 아이탬 관리 |
| 62 | + |
| 63 | +4. **리팩토링** |
| 64 | + |
| 65 | +- `sideMunu`, `landingPage` 등 CSS 리펙토링 |
| 66 | +- `TaskModal` 담당자 선택에 프로필 이미지 적용 |
| 67 | +- `Modalinput` DatePicker 리팩토링 및 한국어화 커스터마이징. 및 모바일 뷰 최적화 |
| 68 | + |
| 69 | +5. **기타 기여 사항** |
| 70 | + |
| 71 | +- 프로젝트 세팅 |
| 72 | +- 프로젝트 전반 QA 및 리팩토링 |
32 | 73 |
|
33 | 74 | ### 조민지 |
34 | 75 |
|
35 | | -- Style: globals.css, custom toast |
36 | | -- 컴포넌트 작성 Gnb |
37 | | -- 페이지 작성 login/signup |
38 | | -- login/logout 전역 상태 관리 -Zustand, UseAuthGuard |
39 | | -- mydashboard에 대시보드 편집 모드 추가 |
40 | | -- 대시보드 멤버 목록 드롭다운 메뉴 기능 |
41 | | -- 404 페이지 작성 |
42 | | -- QA |
| 76 | +1. **전역 스타일링** |
| 77 | + |
| 78 | +- `globals.css`, `custom toast`, 전체 페이지 및 컴포넌트 전반 CSS |
| 79 | + |
| 80 | +2. **공통 컴포넌트** |
| 81 | + |
| 82 | +- Gnb (`HeaderDefalt`, `HeaderDashboard`), 모달, 태그 등 재사용 컴포넌트 공통화 |
| 83 | +- `MemberListMenu` 드롭다운 메뉴 추가(타인의 대시보드 멤버 목록 확인 가능) |
| 84 | + |
| 85 | +3. **페이지** |
| 86 | + |
| 87 | +- 로그인 / 회원가입 / 404페이지 UI 및 기능 구현 |
| 88 | + |
| 89 | +4. **전역 상태 관리 & 예외 처리** |
43 | 90 |
|
| 91 | +- Zustand, `useAuthGuard`를 활용한 전역 인증 상태 관리 및 비로그인 접근 제한 |
| 92 | +- `postAuthGuard`로 중복 POST 요청 방지 |
| 93 | +- 전역 `LoadingSpinner` 적용으로 페이지 이동 중 사용자 경험 개선 |
| 94 | +- 카드, 대시보드, 멤버 등 생성/수정/삭제 시 새로고침 없이 상태가 즉시 반영되도록 구조 리팩토링 |
| 95 | + |
| 96 | +5. **UI/UX 리팩토링** |
| 97 | + |
| 98 | +- 전역 UI 통일: 버튼 순서(`취소` 왼쪽 / `확인` 오른쪽), `cursor`, `disabled`, 경고 메시지 style |
| 99 | +- `SideMenu`, `Header`, `Card` 등에서 제목 생략 처리 및 리스트 overflow 대응 |
| 100 | +- 이미지 팝업 모달 구현(클릭 시 원본 확인 가능) |
| 101 | +- 모바일 대응: `window.innerHeight` 기반 높이 계산 적용 → 스크롤 버그 해결 |
| 102 | +- 모바일 대응: input text size 16px 이상으로 조정 -> IOS 확대 방지 |
| 103 | + |
| 104 | +6. **에러 핸들링 및 사용자 경험 개선** |
| 105 | + |
| 106 | +- 글자수 제한, 이미지 용량 제한, 중복 이메일 가입 등 에러 toast 처리 |
| 107 | +- 대시보드 삭제 재확인 모달 및 댓글/카드 삭제 시 확인 모달 추가 |
| 108 | +- 대시보드 수정/삭제 접근성 개선을 위해 `mydashboard`에 대시보드 편집 모드 추가 |
| 109 | +- 게스트 모드 초기 진입 시, 초대 내역 로딩 전 `EmptyInvitations` 컴포넌트가 깜빡이는 렌더링 버그 해결 (`setTimeout`을 활용한 상태 업데이트 defer 처리로 해결) |
| 110 | + |
| 111 | +7. **기타 기여 사항** |
| 112 | + |
| 113 | +- 게스트 모드 구현 |
| 114 | +- 프로젝트 전반 QA 수행: 정렬 오류, 반응형 깨짐, 유효성 처리 미흡 등 직접 디버깅 혹은 팀원 수정 요청 |
| 115 | +- **Taskify를 실사용**하며 리팩토링 작업 진행, 자체 보드를 통해 일정 관리<br> |
| 116 | + → 사용성 기반 QA를 병행하여 실사용자 관점에서의 불편함을 개선 |
44 | 117 |
|
45 | 118 | ### 김교연 |
46 | 119 |
|
47 | | -- 컴포넌트 작성 invited/ MemberList, inviteRecords, invitedDashBoard, card, Modal |
48 | | -- invitedDashBoard 검색, 무한스크롤, 데이터 별 컴포넌트 분리 |
49 | | -- MemberList 프로필이미지 출력, Modal 대시보드 이름 변경 기능 |
| 120 | +1. **공통 컴포넌트** |
| 121 | + |
| 122 | +- invited (`MemberList`, `inviteRecords`, `invitedDashBoard`), `card`, `Modal` |
| 123 | +- `invitedDashBoard` 검색, 무한스크롤, 데이터 별 컴포넌트 분리 |
| 124 | +- `MemberList` 프로필 이미지 출력, `Modal` 대시보드 이름 변경 기능 |
50 | 125 | - 카드 프로필 및 비밀번호 변경 |
51 | | -- 대시보드 수정 페이지- 이름 변경, 구성원 관리, 대시보드 초대, 삭제 기능 디자인 및 기능 |
| 126 | + |
| 127 | +2. **페이지** |
| 128 | + |
| 129 | +- 대시보드 수정 페이지: 이름 변경, 구성원 관리, 대시보드 초대, 삭제 기능 디자인 및 기능 |
52 | 130 | - toast 알람으로 피드백 추가 |
53 | 131 |
|
54 | 132 | ### 정종우 |
55 | 133 |
|
56 | | -- apiRoutes 설정 |
57 | | -- 컴포넌트 작성 ModalDashBoard, Button(card, Columns,Todo) |
58 | | -- 페이지 작성 mypage |
| 134 | +1. **공통 컴포넌트** |
| 135 | + |
| 136 | +- 컴포넌트 작성 `ModalDashBoard`, Button (`card`, `Columns`, `Todo`) |
59 | 137 | - mypage 프로필 변경, 비밀번호 변경 기능 작성 |
60 | 138 | - 대시보드 카드 모달 삭제기능 |
61 | 139 |
|
| 140 | +2. **페이지** |
62 | 141 |
|
63 | | -# Images |
| 142 | +- 페이지 작성 `mypage` |
64 | 143 |
|
65 | | -https://github.com/user-attachments/assets/64c0e04f-a5da-42c0-a576-1f27519447fb |
| 144 | +3. **기타 기여 사항** |
66 | 145 |
|
| 146 | +- `apiRoutes` 설정 |
67 | 147 |
|
| 148 | +# Images |
| 149 | + |
| 150 | +<div style="text-align: center;"> |
| 151 | + <a href="https://taskify-theta-plum.vercel.app/"> |
| 152 | + <img alt="Taskify" src='public/images/README.gif' width="374" height="670"> |
| 153 | + </a> |
| 154 | +</div> |
68 | 155 |
|
69 | 156 | # Skill Stacks |
70 | 157 |
|
71 | 158 | ## Environment |
72 | 159 |
|
73 | | - |
74 | | - |
75 | 160 | <img alt="Git" src ="https://img.shields.io/badge/Git-f05032.svg?&style=for-the-badge&logo=Git&logoColor=white"/> <img alt="GitHub" src ="https://img.shields.io/badge/GitHub-181717.svg?&style=for-the-badge&logo=GitHub&logoColor=white"/> <img alt="VSCode" src ="https://img.shields.io/badge/VSCode-007acc.svg?&style=for-the-badge&logo=visualstudiocode&logoColor=white"/> <img alt="Vercel" src ="https://img.shields.io/badge/Vercel-000000.svg?&style=for-the-badge&logo=Vercel&logoColor=white"/> <img alt="Figma" src ="https://img.shields.io/badge/Figma-f24e1e.svg?&style=for-the-badge&logo=Figma&logoColor=white"/> |
76 | 161 |
|
77 | | - |
78 | | - |
79 | 162 | ## Development |
80 | 163 |
|
81 | | - |
82 | | - |
83 | 164 | <img src="https://img.shields.io/badge/React-61DAFB?style=for-the-badge&logo=React&logoColor=white"> <img alt="Tailwind CSS" src ="https://img.shields.io/badge/Tailwind_CSS-06B6D4.svg?&style=for-the-badge&logo=tailwindcss&logoColor=white"/> <img alt="TypeScript" src ="https://img.shields.io/badge/TypeScript-3178C6.svg?&style=for-the-badge&logo=TypeScript&logoColor=white"/> <img alt="Next.js" src ="https://img.shields.io/badge/Next.js-000000.svg?&style=for-the-badge&logo=Next.js&logoColor=white"/> |
84 | 165 |
|
85 | 166 | ## Libraries |
86 | 167 |
|
87 | | -<img alt="Axios" src ="https://img.shields.io/badge/Axios-5429e4.svg?&logo=Axios&logoColor=white&style=for-the-badge"/> <img alt="clsx" src ="https://img.shields.io/badge/clsx-CB3837.svg?&style=for-the-badge"/> |
88 | | - |
| 168 | +<img alt="Axios" src ="https://img.shields.io/badge/Axios-5429e4.svg?&logo=Axios&logoColor=white&style=for-the-badge"/> <img alt="clsx" src ="https://img.shields.io/badge/clsx-CB3837.svg?&style=for-the-badge"/> |
89 | 169 |
|
90 | 170 | # Package Structure |
91 | 171 |
|
92 | | - |
93 | 172 | ``` |
94 | 173 | taskify |
95 | 174 | ├─ public |
@@ -126,6 +205,7 @@ npm install |
126 | 205 |
|
127 | 206 | ```bash |
128 | 207 | npm start dev |
| 208 | +npm run dev |
129 | 209 | ``` |
130 | 210 |
|
131 | 211 | 4. Open the project in your browser |
|
0 commit comments