Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
ce64a99
design: 카톡 로그인 로딩스피너 추가
Nov 26, 2025
1decdcf
Merge branch 'develop' of https://github.com/Cowokers-team/coworkes i…
huuitae Nov 26, 2025
2d34764
Merge branch 'develop' into fix/my-history
huuitae Nov 26, 2025
94cbb4a
refactor : 게시글 수정 디자인 수정
junye0l Nov 26, 2025
2ad9003
refactor : 스타일 수정 및 가독성 개선
junye0l Nov 26, 2025
3069b93
refactor : 계정 설정 페이지 디자인 수정
junye0l Nov 26, 2025
7b2b27a
refactor : 토스트 컴포넌트 아웃라인 속성 제거
junye0l Nov 26, 2025
da4e240
design: 스켈레톤 UI 추가, 마이 히스토리 페이지 레이아웃 변경
huuitae Nov 26, 2025
6ee5e0e
fix : 마진 병합으로 인한 레이아웃 시프트 버그 해결
junye0l Nov 26, 2025
bb4a047
fix: 마이 히스토리 리스트 표출 함수 수정
huuitae Nov 26, 2025
9bf9d8f
feat: open graph 추가
huuitae Nov 27, 2025
2a18bc9
refactor: 카카오 디자인 수정, 쿠키에 토큰 넣는 중복 코드 제거
Nov 27, 2025
fb87be5
refactor: api fetch에서 axios 인스턴스로 변경
Nov 27, 2025
fe33a86
Merge branch 'develop' of https://github.com/Part-4-1/coworkers into …
Nov 27, 2025
f54fa34
feat : 팀 참여 페이지 메타데이터 작업
junye0l Nov 27, 2025
0775ec9
feat : 팀 생성 페이지 메타데이터 작업
junye0l Nov 27, 2025
03dc067
feat : 계정 설정 페이지 메타데이터 작업
junye0l Nov 27, 2025
96cfde2
Merge pull request #180 from Part-4-1/feat/google-signin
leohan6540 Nov 27, 2025
1743589
Merge branch 'develop' of https://github.com/Cowokers-team/coworkes i…
huuitae Nov 27, 2025
6ccf988
Merge branch 'develop' into fix/my-history
huuitae Nov 27, 2025
8d81680
Merge branch 'develop' into feat/metadata-setting
junye0l Nov 27, 2025
d274260
feat : 자유게시판 페이지 메타데이터 작업
junye0l Nov 27, 2025
69682e0
feat : 자유게시판 상세 페이지 동적 메타데이터 작업
junye0l Nov 27, 2025
5da67c5
feat : 자유게시판 게시글 작성 페이지 메타데이터 작업
junye0l Nov 27, 2025
1795210
refactor : 자유게시판 동적 메타데이터 개선 작업
junye0l Nov 27, 2025
1efcc50
refactor : 메타데이터 일부 수정
junye0l Nov 27, 2025
c87ddd4
design : 자유게시판 더보기 버튼 제거
junye0l Nov 27, 2025
3506fe4
chore: 유저 부분 SEO 개선
Nov 27, 2025
efa6acb
fix: 모달 스크롤 방지 로직 수정
huuitae Nov 27, 2025
0208d7d
chore: 사이드바 SEO 개선 작업
Nov 27, 2025
4b54af8
chore : 기존 스크롤 방지 로직으로 롤백
junye0l Nov 27, 2025
f2864eb
refactor : 쿠키 전달하는 로직 추가
junye0l Nov 27, 2025
170e4f7
feat: 할 일 목록 페이지 metadata 추가
huuitae Nov 27, 2025
6d2d7b3
refactor : 토큰 없을시 로그인 페이지로 리다이렉트 연결
junye0l Nov 27, 2025
360176e
feat: 할 일 상세 metadata 추가
huuitae Nov 27, 2025
a43e37b
chore: 스토리북 추가
Nov 27, 2025
594bb87
fix: 메타데이터 수정,404 페이지 메타 데이터 추가
huuitae Nov 27, 2025
e51f9de
fix: 할 일 목록 페이지 수정
huuitae Nov 28, 2025
4cec755
Merge pull request #178 from Part-4-1/fix/my-history
huuitae Nov 28, 2025
dc00106
Merge branch 'develop' into feat/metadata-setting
junye0l Nov 28, 2025
b3fd6a6
chore: 스토리북 에러 해결을 위한 라이브러리 설치
Nov 28, 2025
cbab0c5
Merge branch 'develop' of https://github.com/Part-4-1/coworkers into …
Nov 28, 2025
164fd19
[#171] 담당 페이지 메타데이터 작업
junye0l Nov 28, 2025
74283bf
Merge branch 'develop' of https://github.com/Part-4-1/coworkers into …
Nov 28, 2025
a774b37
chore: 스토리북 라이브러리 dev의존성으로 변경
Nov 28, 2025
18867c6
Merge pull request #184 from Part-4-1/sidebar-login/metadata
leohan6540 Nov 28, 2025
7cec1a6
docs: 리드미 1차 작성
JinHyuk-Kim66 Nov 27, 2025
aaf1fda
docs: Read.me 이미지 변경
JinHyuk-Kim66 Nov 27, 2025
8695e9a
docs: README 이미지 변경
JinHyuk-Kim66 Nov 27, 2025
bd468a0
docs: 리드미 작성 (미완)
JinHyuk-Kim66 Nov 27, 2025
2a8e0bc
docs: 클론 주소 수정
JinHyuk-Kim66 Nov 27, 2025
188a623
Merge pull request #186 from Part-4-1/docs/readme
JinHyuk-Kim66 Nov 28, 2025
6eebc94
fix: 에러처리 로직 수정
huuitae Nov 28, 2025
2645dc9
chore: 코드 수정
huuitae Nov 28, 2025
5c1d1c5
Merge branch 'develop' of https://github.com/Cowokers-team/coworkes i…
huuitae Nov 28, 2025
558f3d9
Merge branch 'develop' into fix/my-history
huuitae Nov 28, 2025
f3498ca
fix: 오류 처리 재수정
huuitae Nov 28, 2025
f06ffdb
Merge pull request #187 from Part-4-1/fix/my-history
huuitae Nov 28, 2025
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
192 changes: 191 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,191 @@
Coworkers
# 💎 Coworkers 💎


랜딩페이지 이미지 (추가 예정)


<p align="left">
<a href="https://coworkers-pied.vercel.app/"><strong>🚀 서비스 바로가기</strong></a>
</p>

<br>

## 📝 소개

>Coworkers는 여러 명이 하나의 그룹을 만들어
할 일(Task)을 함께 공유하고 관리할 수 있는 협업용 To-do 플랫폼입니다.

<br>

## 🎯 목적

>팀 단위로 할 일을 정리하고 진행 상황을 투명하게 공유하여,
협업 효율을 높이는 것이 Coworkers의 핵심 목적입니다.

<br>


## ✨주요 기능

|팀 페이지|
|:---:|
|<img src="https://github.com/user-attachments/assets/772899fe-b186-4bf8-b12f-0e7701f03d0f" width="450"/>|
|팀의 전체적인 진행 현황과 멤버 정보를 확인할 수 있는 팀 요약 화면|


|할 일 관리|
|:---:|
|<img src="https://github.com/user-attachments/assets/78bb57db-ee85-4620-af44-92a97b23c62b" width="450"/>|
|날짜별 할 일을 확인하고, 상세 보기 및 완료 체크를 할 수 있는 화면|


|자유게시판|
|:---:|
|<img src="https://github.com/user-attachments/assets/11132fdd-b519-40b5-9a6a-22c66af7bc9a" width="450"/>|
|자유롭게 소통하고 정보를 공유할 수 있는 커뮤니티 공간|

<br />

<br>

## 🧰 기술 스택

### 🧩 프론트엔드
<img src="https://img.shields.io/badge/Next.js-000000?style=for-the-badge&logo=Next.js&logoColor=white"> <img src="https://img.shields.io/badge/React-61DAFB?style=for-the-badge&logo=React&logoColor=white"> <img src="https://img.shields.io/badge/TypeScript-3178C6?style=for-the-badge&logo=TypeScript&logoColor=white"> <img src="https://img.shields.io/badge/TailwindCSS-06B6D4?style=for-the-badge&logo=tailwindcss&logoColor=white"> <img src="https://img.shields.io/badge/React_Query-FF4154?style=for-the-badge&logo=ReactQuery&logoColor=white"> <img src="https://img.shields.io/badge/React_Hook_Form-EC5990?style=for-the-badge&logo=reacthookform&logoColor=white"> <img src="https://img.shields.io/badge/Axios-5A29E4?style=for-the-badge&logo=axios&logoColor=white" /> <img src="https://img.shields.io/badge/Storybook-FF4785?style=for-the-badge&logo=storybook&logoColor=white">
### 🛠 코드 포매터 및 검사 도구
<img src="https://img.shields.io/badge/ESLint-4B32C3?style=for-the-badge&logo=eslint&logoColor=white"> <img src="https://img.shields.io/badge/Prettier-F7B93E?style=for-the-badge&logo=prettier&logoColor=white">
### 🤝 협업 도구
<img src="https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=GitHub&logoColor=white" /> <img src="https://img.shields.io/badge/Figma-F24E1E?style=for-the-badge&logo=Figma&logoColor=white"> <img src="https://img.shields.io/badge/Discord-5B61EE?style=for-the-badge&logo=Discord&logoColor=white" /> <img src="https://img.shields.io/badge/Notion-000000?style=for-the-badge&logo=Notion&logoColor=white">
### 🚀 배포 플랫폼
<img src="https://img.shields.io/badge/Vercel-000000?style=for-the-badge&logo=vercel&logoColor=white" />

<br>

## 📁 폴더 구조
```
src/
├── app/ # Next.js App Router 기반 페이지
├── api/ # 서버 API 요청 모듈 (도메인별 CRUD)
├── components/ # 재사용 가능한 공통 UI 컴포넌트
├── hooks/ # 커스텀 훅 (API 훅 포함)
├── assets/ # 아이콘 및 이미지 리소스
├── constants/ # 상수 값 및 공통 설정
├── types/ # TypeScript 타입 정의
└── utils/ # 공통 유틸 함수
```

<br>

## 🚀 실행 방법
```
# 1. 저장소 클론
git clone https://github.com/Part-4-1/coworkers.git

# 2. 폴더 이동
cd coworkers

# 3. 패키지 설치
npm install

# 4. 개발 서버 실행
npm run dev
```

<br>

## 🔐 환경 변수
```
NEXT_PUBLIC_API_URL=서버_API_베이스_URL
NEXT_PUBLIC_KAKAO_REST_API_KEY=카카오_REST_API_키
NEXT_PUBLIC_REDIRECT_URI=카카오_OAuth_리다이렉트_URL(로컬)
NEXT_PUBLIC_KAKAO_REDIRECT_URI=카카오_OAuth_리다이렉트_URL
```

<br>

<br>

## 📌 데일리 팀 스크럼
> 효과적인 협업을 위해 매일 스크럼을 진행하며, 공유된 내용은 노션 문서로 체계적으로 기록합니다.

#### 🗓️ 시간표

| 요일 | 시간 |
| :-------------: | :-------: |
| 화요일 | **13:00** |
| 월·수·목·금·토 | **13:30** |

<br>

## 👥 팀원 소개

<table align="center">
<tbody>
<tr>
<!-- 팀원 1 -->
<td align="center" width="200">
<a href="https://github.com/huuitae">
<img src="https://avatars.githubusercontent.com/GITHUB_USERNAME_1" width="100" height="100"/><br/>
<strong>황휘태 (팀장)</strong>
</a>
<ul style="list-style: none; padding: 0; margin-top: 8px;">
<li>담당 작업 1</li>
<li>담당 작업 2</li>
<li>담당 작업 3</li>
</ul>
</td>
<!-- 팀원 2 -->
<td align="center" width="200">
<a href="https://github.com/junye0l">
<img src="https://avatars.githubusercontent.com/GITHUB_USERNAME_2" width="100" height="100"/><br/>
<strong>김준열</strong>
</a>
<ul style="list-style: none; padding: 0; margin-top: 8px;">
<li>담당 작업 1</li>
<li>담당 작업 2</li>
<li>담당 작업 3</li>
</ul>
</td>
<!-- 팀원 3 -->
<td align="center" width="200">
<a href="https://github.com/JinHyuk-Kim66">
<img src="https://avatars.githubusercontent.com/GITHUB_USERNAME_3" width="100" height="100"/><br/>
<strong>김진혁</strong>
</a>
<ul style="list-style: none; padding: 0; margin-top: 8px;">
<li>담당 작업 1</li>
<li>담당 작업 2</li>
<li>담당 작업 3</li>
</ul>
</td>
</tr>
<tr>
<!-- 팀원 4 -->
<td align="center" width="200">
<a href="https://github.com/onesiin">
<img src="https://avatars.githubusercontent.com/GITHUB_USERNAME_4" width="100" height="100"/><br/>
<strong>정철종</strong>
</a>
<ul style="list-style: none; padding: 0; margin-top: 8px;">
<li>담당 작업 1</li>
<li>담당 작업 2</li>
<li>담당 작업 3</li>
</ul>
</td>
<!-- 팀원 5 -->
<td align="center" width="200">
<a href="https://github.com/leohan6540">
<img src="https://avatars.githubusercontent.com/GITHUB_USERNAME_5" width="100" height="100"/><br/>
<strong>한장희</strong>
</a>
<ul style="list-style: none; padding: 0; margin-top: 8px;">
<li>담당 작업 1</li>
<li>담당 작업 2</li>
<li>담당 작업 3</li>
</ul>
</td>
</tr>
</tbody>
</table>

<br>
18 changes: 18 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
},
"devDependencies": {
"@chromatic-com/storybook": "^4.1.2",
"@emotion/is-prop-valid": "^1.4.0",
"@storybook/addon-a11y": "^10.0.2",
"@storybook/addon-docs": "^10.0.2",
"@storybook/addon-onboarding": "^10.0.2",
Expand Down
31 changes: 31 additions & 0 deletions src/api/articles/get-article-detail.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import axios from "axios";
import { Article } from "@/types/article";

const getArticleDetail = async (
articleId: number,
accessToken?: string
): Promise<Article | null> => {
try {
const headers: Record<string, string> = {
"Content-Type": "application/json",
};

if (accessToken) {
headers.Authorization = `Bearer ${accessToken}`;
}

const response = await axios.get(
`${process.env.NEXT_PUBLIC_API_URL}/articles/${articleId}`,
{ headers }
);

if (!response) throw new Error("데이터를 불러오지 못했습니다.");

return response.data;
} catch (error) {
console.error(error);
return null;
}
};

export default getArticleDetail;
35 changes: 29 additions & 6 deletions src/api/task/get-task-detail.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,38 @@
import instance from "@/utils/axios";
import { notFound } from "next/navigation";

export const fetchTaskDetail = async (
groupId: number,
taskListId: number,
taskId: number,
token: string
) => {
try {
const response = await fetch(
`${process.env.NEXT_PUBLIC_API_URL}/groups/${groupId}/task-lists/${taskListId}/tasks/${taskId}`,
{
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
}
);

if (response.status === 404) notFound();

return response.json();
} catch (error) {
throw error;
}
};

/**
* @author hwitae
* @description 할 일 상세 정보를 조회합니다.
* @param taskId 할 일 ID
*/
const getTaskDetail = async (
export const getTaskDetail = async (
groupId: number,
taskListId: number,
taskId: number
Expand All @@ -15,12 +42,8 @@ const getTaskDetail = async (
`/groups/${groupId}/task-lists/${taskListId}/tasks/${taskId}`
);

if (!response) throw new Error("데이터를 불러오지 못했습니다.");

return response.data;
} catch (error) {
console.error(error);
throw error;
}
};

export default getTaskDetail;
28 changes: 25 additions & 3 deletions src/api/task/get-task-list.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,31 @@
import { TaskList } from "@/types/taskList";
import instance from "@/utils/axios";

const getTaskList = async (
export const fetchTaskList = async (
groupId: number,
taskListId: number,
token: string
) => {
try {
const response = await fetch(
`${process.env.NEXT_PUBLIC_API_URL}/groups/${groupId}/task-lists/${taskListId}`,
{
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
}
);

return response.json();
} catch (error) {
console.error(error);
throw error;
}
};

export const getTaskList = async (
groupId: number,
taskListId: number,
date?: string
Expand All @@ -15,5 +39,3 @@ const getTaskList = async (
throw error;
}
};

export default getTaskList;
Loading
Loading