Skip to content

Commit

Permalink
Merge branch 'develop' of https://github.com/GU-99/grow-up-fe into fe…
Browse files Browse the repository at this point in the history
…ature/#225-team-query-modify
  • Loading branch information
ice-bear98 committed Oct 19, 2024
2 parents 27cbeed + 382fe2a commit a9724c3
Show file tree
Hide file tree
Showing 6 changed files with 355 additions and 149 deletions.
10 changes: 6 additions & 4 deletions src/components/common/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { logout } from '@services/authService';
import useToast from '@hooks/useToast';

export default function Header() {
const { userInfo: userInfoData, onLogout, clearUserInfo } = useStore();
const { userInfo: userInfoData, onLogout, clearUserInfo, isAuthenticated } = useStore();
const navigate = useNavigate();
const { toastSuccess } = useToast();

Expand All @@ -33,7 +33,9 @@ export default function Header() {
</Link>
</div>
<nav className="flex items-center">
<div className="tracking-tight text-white">{userInfoData.nickname}님의 Grow Up! 응원합니다.</div>
{isAuthenticated && (
<div className="tracking-tight text-white">{userInfoData.nickname}님의 Grow Up! 응원합니다.</div>
)}
<NavLink to="/" className="ml-10 hover:brightness-90">
{({ isActive }) => <FiHome className={`size-20 ${isActive ? 'text-selected' : 'text-white'}`} />}
</NavLink>
Expand All @@ -43,9 +45,9 @@ export default function Header() {
<button
type="button"
className="ml-10 h-20 rounded-md bg-white px-4 tracking-tight hover:brightness-90"
onClick={handleLogout}
onClick={isAuthenticated ? handleLogout : () => navigate('/signin')}
>
Logout
{isAuthenticated ? 'Logout' : 'Login'}
</button>
</nav>
</header>
Expand Down
121 changes: 112 additions & 9 deletions src/mocks/mockAPI.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ import {
TASK_DUMMY,
TASK_FILE_DUMMY,
TASK_USER_DUMMY,
TEAM_USER_DUMMY,
USER_DUMMY,
} from '@mocks/mockData';

import type { Role } from '@/types/RoleType';
import type { User } from '@/types/UserType';
import type { Team } from '@/types/TeamType';
import type { Project } from '@/types/ProjectType';
import type { ProjectStatus } from '@/types/ProjectStatusType';
import type { ProjectStatus, ProjectStatusForm } from '@/types/ProjectStatusType';
import type { Task, TaskUpdateForm } from '@/types/TaskType';
import type { TaskFileForMemory, TaskUser, UploadTaskFile } from '@/types/MockType';

Expand All @@ -31,23 +33,61 @@ export function findUser(userId: User['userId']) {
return USER_DUMMY.find((user) => user.userId === userId);
}

/* ============= 프로젝트 유저(Project User) 관련 처리 ============= */
/* ============= 팀에 연결된 유저(Team User) 관련 처리 ============= */

// 프로젝트 유저 조회
// 팀과 연결된 유저 조회
export function findTeamUser(teamId: Team['teamId'], userId: User['userId']) {
return TEAM_USER_DUMMY.find((teamUser) => teamUser.teamId === teamId && teamUser.userId === userId);
}

/* ========= 프로젝트에 연결된 유저(Project User) 관련 처리 ========= */

// 프로젝트와 연결된 유저 조회
export function findProjectUser(projectId: Project['projectId'], userId: User['userId']) {
return PROJECT_USER_DUMMY.find((projectUser) => projectUser.projectId === projectId && projectUser.userId === userId);
}

/* ================= 프로젝트(Project ) 관련 처리 ================= */
// 프로젝트의 연결된 모든 유저 조회
export function findAllProjectUser(projectId: Project['projectId']) {
return PROJECT_USER_DUMMY.filter((projectUser) => projectUser.projectId === projectId);
}

// 프로젝트와 연결된 모든 유저 삭제
export function deleteAllProjectUser(projectId: Project['projectId']) {
const filteredProjectUsers = PROJECT_USER_DUMMY.filter((projectUser) => projectUser.projectId !== projectId);
if (PROJECT_USER_DUMMY.length !== filteredProjectUsers.length) {
PROJECT_USER_DUMMY.length = 0;
PROJECT_USER_DUMMY.push(...filteredProjectUsers);
}
}

/* ================= 프로젝트(Project) 관련 처리 ================= */

// 프로젝트 조회
export function findProject(projectId: Project['projectId']) {
return PROJECT_DUMMY.find((project) => project.projectId === projectId);
}

// 특정 팀의 모든 프로젝트 조회
export function findAllProject(teamId: Team['teamId']) {
return PROJECT_DUMMY.filter((project) => project.teamId === teamId);
}

// 프로젝트 삭제
export function deleteProject(projectId: Project['projectId']) {
const projectIndex = PROJECT_DUMMY.findIndex((project) => project.projectId === projectId);
if (projectIndex === -1) throw new Error('프로젝트를 찾을 수 없습니다.');
PROJECT_DUMMY.splice(projectIndex, 1);
}

/* ================ 프로젝트 상태(Status) 관련 처리 ================ */

// 상태 정보 조회
// 프로젝트 상태 정보 생성
export function createProjectStatus(newStatus: ProjectStatus) {
STATUS_DUMMY.push(newStatus);
}

// 프로젝트 상태 정보 조회
export function findProjectStatus(statusId: ProjectStatus['statusId']) {
return STATUS_DUMMY.find((status) => status.statusId === statusId);
}
Expand All @@ -57,6 +97,53 @@ export function findAllProjectStatus(projectId: Project['projectId']) {
return STATUS_DUMMY.filter((status) => status.projectId === projectId);
}

// 프로젝트 상태 정보 수정
export function updateProjectStatus(statusId: ProjectStatus['statusId'], newStatusInfo: ProjectStatusForm) {
const status = findProjectStatus(statusId);
if (!status) throw new Error('프로젝트 상태를 찾을 수 없습니다.');

const { statusName, colorCode, sortOrder } = newStatusInfo;
status.statusName = statusName;
status.colorCode = colorCode;
status.sortOrder = sortOrder;
}

// 프로젝트 상태 정보 삭제
export function deleteProjectStatus(statusId: ProjectStatus['statusId']) {
const statusIndex = STATUS_DUMMY.findIndex((status) => status.statusId === statusId);
if (statusIndex === -1) throw new Error('프로젝트 상태를 찾을 수 없습니다.');
STATUS_DUMMY.splice(statusIndex, 1);
}

// 특정 프로젝트의 모든 상태 삭제
export function deleteAllProjectStatus(projectId: Project['projectId']) {
const filteredStatuses = STATUS_DUMMY.filter((status) => status.projectId !== projectId);
if (filteredStatuses.length !== STATUS_DUMMY.length) {
STATUS_DUMMY.length = 0;
STATUS_DUMMY.push(...filteredStatuses);
}
}

// 프로젝트 상태 순서 재정렬
export function reorderStatusByProject(projectId: Project['projectId']) {
STATUS_DUMMY.filter((status) => status.projectId === projectId)
.sort((a, b) => a.sortOrder - b.sortOrder)
.forEach((status, index) => {
status.sortOrder = index + 1;
});
}

/* ============ 일정에 연결된 유저(Task User) 관련 처리 ============ */

// 일정과 연결된 모든 유저 삭제
export function deleteAllTaskUser(taskId: Task['taskId']) {
const filteredTaskUsers = TASK_USER_DUMMY.filter((taskUser) => taskUser.taskId !== taskId);
if (filteredTaskUsers.length !== TASK_USER_DUMMY.length) {
TASK_USER_DUMMY.length = 0;
TASK_USER_DUMMY.push(...filteredTaskUsers);
}
}

/* ===================== 일정(Task) 관련 처리 ===================== */

// 일정 추가
Expand All @@ -75,10 +162,16 @@ export function findAllTask(statusId: ProjectStatus['statusId']) {
}

// 일정 수정
export function updateTask(taskId: Task['taskId'], taskInfoData: TaskUpdateForm) {
const taskIndex = TASK_DUMMY.findIndex((task) => task.taskId === taskId);
if (taskIndex === -1) throw new Error('일정 정보를 찾을 수 없습니다.');
TASK_DUMMY[taskIndex] = { ...TASK_DUMMY[taskIndex], ...taskInfoData, statusId: Number(taskInfoData.statusId) };
export function updateTask(taskId: Task['taskId'], newTaskInfo: TaskUpdateForm) {
const task = findTask(taskId);
if (!task) throw new Error('일정 정보를 찾을 수 없습니다.');

const { statusId, taskName, content, startDate, endDate } = newTaskInfo;
task.statusId = Number(statusId);
task.taskName = taskName;
task.content = content;
task.startDate = startDate;
task.endDate = endDate;
}

// 일정 삭제
Expand All @@ -88,6 +181,16 @@ export function deleteTask(taskId: Task['taskId']) {
TASK_DUMMY.splice(taskIndex, 1);
}

// 특정 프로젝트의 모든 일정 삭제
export function deleteAllTask(projectId: Project['projectId']) {
const statusIds = findAllProjectStatus(projectId).map((status) => status.statusId);
const filteredTasks = TASK_DUMMY.filter((task) => !statusIds.includes(task.statusId));
if (TASK_DUMMY.length !== filteredTasks.length) {
TASK_DUMMY.length = 0;
TASK_DUMMY.push(...filteredTasks);
}
}

// 일정 수행자 추가
export function createAssignee(assignee: TaskUser) {
TASK_USER_DUMMY.push(assignee);
Expand Down
9 changes: 1 addition & 8 deletions src/mocks/services/authServiceHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,16 +278,9 @@ const authServiceHandler = [

// 로그아웃 API
http.post(`${BASE_URL}/user/logout`, async ({ cookies }) => {
const { refreshToken, refreshTokenExpiresAt } = cookies;
const { refreshToken } = cookies;
const currentTime = Date.now();

if (!refreshToken || !refreshTokenExpiresAt) {
return HttpResponse.json(
{ message: '리프레시 토큰이 유효하지 않습니다. 다시 로그인해 주세요.' },
{ status: 401 },
);
}

return new HttpResponse(null, {
status: 200,
headers: {
Expand Down
Loading

0 comments on commit a9724c3

Please sign in to comment.