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

[RELEASE] release 3.0.1 출석상태 polling 기능 추가 #153

Merged
merged 49 commits into from
Dec 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
750343b
fix: 올바르게 출석체크 버튼이 활성화 되도록 수정(UserAttendModal.tsx)
geongyu09 Nov 1, 2024
9767fc2
[FIX] 올바르게 출석체크 버튼이 활성화 되도록 수정 (#125)
geongyu09 Nov 1, 2024
005bf72
chore: github url의 validation의 책임을 전부 백엔드가 가지도록 수정
geongyu09 Nov 2, 2024
83c1e03
[CHORE] github url의 validation을 전부 백엔드로 위임 (127)
geongyu09 Nov 2, 2024
5580aeb
test: 슬랙 메시지 요청 테스트 url 수정
geongyu09 Nov 2, 2024
0ca35d4
[TEST]: 슬랙 메시지 요청 테스트 url 수정 (#129)
geongyu09 Nov 2, 2024
4910992
feat: member 상태에 따라 polling 적용
Klomachenko Nov 21, 2024
71d4c2f
[FEAT] member 상태에 따라 polling 적용(#133)
Klomachenko Nov 22, 2024
7f65c08
feat: attendStatus에 따른 refetchInterval을 통한 polling 구현
Klomachenko Nov 24, 2024
f81879b
[FEAT] attendStatus에 따른 refetchInterval을 통한 polling 구현 (#136)
Klomachenko Nov 24, 2024
47f779d
feat: program attendMode statleTime 변경
Klomachenko Nov 24, 2024
943418a
[FEAT] useGetProgramId staleTime 변경 (#137)
Klomachenko Nov 24, 2024
42ec3ff
feat: 멤버 상태 polling 동시성 race condition 이슈 해결
Klomachenko Nov 24, 2024
dd3e397
[FEAT] 멤버 상태 polling synchronicity race condition (#139)
Klomachenko Nov 24, 2024
75227a8
refactor: 코딩 컨밴션에 맞추어 폴더 구조 변경
geongyu09 Nov 27, 2024
bc86089
refactor: 더이상 사용하지 않는 파일 제거
geongyu09 Nov 27, 2024
566d1b2
feat: dashboard에서 사용하는 전역 상태 정의
geongyu09 Nov 27, 2024
c44fbb4
feat: 익명 데이터 추가로 변경된 api 수정
geongyu09 Nov 28, 2024
93f7805
refactor: CheckBox 컴포넌트 조금 더 재사용 가능하게 상위에서 classname을 받을 수 있도록 수정
geongyu09 Nov 28, 2024
0ad92e5
feat: 사용자가 입력한 데이터를 로컬스토리지에 저장하여 임시 저장 기능 구현
geongyu09 Nov 28, 2024
a79c958
feat: 댓글 작성 쿼리에 낙관적 업데이트 추가
geongyu09 Nov 28, 2024
f757027
fix: 올바르게 타입 지정이 안되어 있던 부분 수정(CheckBox.tsx)
geongyu09 Nov 28, 2024
2e06eac
fix: 올바르게 주석 설명이 안되어 있던 부분 수정(question.ts)
geongyu09 Nov 28, 2024
46d9f53
refactor: 사용하지 않는 파일 제거(DachboardContentChatBox.tsx)
geongyu09 Nov 28, 2024
b895120
fix: 요구사항에 따른 유저 플로우에 맞춰 답변하기 클릭시 익명이 풀리도록 수정
geongyu09 Nov 28, 2024
cea45bc
feat: 답변에서 낙관적 업데이트가 올바르게 되지 않던 버그 수정
geongyu09 Nov 28, 2024
1ca1f6c
test: 변경사항에 맞추어 테스트 변경
geongyu09 Nov 28, 2024
e1fe7ba
[FEAT] 익명 댓글 기능 추가 (#142)
geongyu09 Nov 28, 2024
e236793
refactor(detail-refactor): 디테일 페이지에서 불필요하게 컴포넌트 뎊스를 가지는 부분 수정
geongyu09 Nov 29, 2024
4bc2238
refactor(detail-refactor): programDetailSection에서 불필요하게 section들이 묶여있…
geongyu09 Nov 29, 2024
7f0c3f4
refactor: 질문 게시판에서 사용하는 팀 이름 탭 부분을 컴포넌트로 분리
geongyu09 Nov 29, 2024
9249e11
feat: 게스트로 디테일 페이지 접근시 블러 처리된 질문게시판이 보이도록 수정
geongyu09 Nov 30, 2024
b22f755
fix: 변경된 api 명세에 맞추어 body값 변경
geongyu09 Nov 30, 2024
ed11dd4
fix: 빌드 오류 해결
geongyu09 Nov 30, 2024
9858c72
fix: 타입 변경에 대하여 아직 수정하지 않았던 코드들 수정
geongyu09 Nov 30, 2024
abc2761
[FEAT] 게스트 페이지에서 질문 게시판이 블러 처리된 상태로 보이도록 추가 (#143)
geongyu09 Dec 1, 2024
4c666b7
feat: 질문 입력창 resize 기능 추가
geongyu09 Dec 1, 2024
8f34535
[FEAT] 질문 입력 창 크기 조절 추가 (#145)
geongyu09 Dec 2, 2024
7bed8e1
feat: 대댓글의 대댓글 기능 추가
geongyu09 Dec 2, 2024
5d9a28a
fix: 대댓글의 대댓글 기능이 생김에 따라서 대댓글의 대댓글 추가시 올바르게 낙관적 업데이트가 되도록 수정
geongyu09 Dec 2, 2024
cc712f5
[FEAT] 대댓글의 대댓글 기능 추가 (#147)
geongyu09 Dec 2, 2024
ba9a925
fix: polling issue 해결
Klomachenko Dec 3, 2024
0084746
[FIX] polling issue 해결 (#148)
Klomachenko Dec 3, 2024
c462d1f
feat: onSuccess invalidateQueries 로직 추가
Klomachenko Dec 3, 2024
266e7f1
[FIX] onSuccess invalidateQueries 로직 추가 (#150)
Klomachenko Dec 3, 2024
d77c278
fix: attendMode invalidateQueries 적용
Klomachenko Dec 3, 2024
b6fe0f7
Merge branch 'develop' into fix/151/re-admin-attendMode-sync
Klomachenko Dec 3, 2024
c699689
[FIX] attendMode invalidateQueries 적용 (#152)
Klomachenko Dec 3, 2024
0d8d357
fix: develop -> main 충돌 해결
Klomachenko Dec 5, 2024
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
3 changes: 2 additions & 1 deletion FE/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,5 +64,6 @@
"tailwindcss": "latest",
"ts-node": "^10.9.2",
"typescript": "latest"
}
},
"packageManager": "[email protected]+sha1.8adba2d20330c02d3856e18c4eb3819d1d3ca6aa"
}
3 changes: 2 additions & 1 deletion FE/src/apis/__test__/program.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ describe("sendSlackMessage", () => {

// 내부 구현사항
expect(https).toHaveBeenCalledWith({
data: { programUrl: "https://econo.eeos.store/detail/1" },
data: { programUrl: "https://eeos.co.kr/detail/1" },
method: "POST",
url: "/programs/1/slack/notification",
});
Expand Down Expand Up @@ -381,6 +381,7 @@ describe("patchProgram", () => {
},
],
teams: [{ teamId: 1 }],
programGithubUrl: "",
};

const programId = 1;
Expand Down
30 changes: 29 additions & 1 deletion FE/src/apis/__test__/question.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,10 @@ describe("postQuestion", () => {
const programId = 1;
const teamId = 1;
const questionContent = "질문 내용";
const isAnonymous = 0;

// act
await postQuestion({ programId, teamId, questionContent });
await postQuestion({ programId, teamId, questionContent, isAnonymous });

// assert
expect(mockHttps).toHaveBeenCalledWith({
Expand All @@ -67,6 +68,30 @@ describe("postQuestion", () => {
data: {
programId,
teamId,
isAnonymous: 0,
content: questionContent,
parentsCommentId: -1,
},
});
});
it("익명 질문을 등록한다", async () => {
// arrange
const programId = 1;
const teamId = 1;
const questionContent = "질문 내용";
const isAnonymous = 1;

// act
await postQuestion({ programId, teamId, questionContent, isAnonymous });

// assert
expect(mockHttps).toHaveBeenCalledWith({
url: "comments",
method: "POST",
data: {
programId,
teamId,
isAnonymous: 1,
content: questionContent,
parentsCommentId: -1,
},
Expand All @@ -78,13 +103,15 @@ describe("postQuestion", () => {
const teamId = 1;
const questionContent = "답변 내용";
const parentsCommentId = 1;
const isAnonymous = 0;

// act
await postQuestion({
programId,
teamId,
questionContent,
parentsCommentId,
isAnonymous,
});

// assert
Expand All @@ -94,6 +121,7 @@ describe("postQuestion", () => {
data: {
programId,
teamId,
isAnonymous: 0,
content: questionContent,
parentsCommentId,
},
Expand Down
14 changes: 13 additions & 1 deletion FE/src/apis/question.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,34 @@ export const getQuestionsByTeam = async (programId: number, teamId: number) => {
return new QuestionListDto(data?.data);
};

/**
* 질문을 등록합니다.
* - isAnonymous : 질문을 등록할 때 체크박스를 체크했는지 여부. 체크가 되었다면 1, 아니라면 0
*/
export interface PostQuestionParams {
programId: number;
teamId: number;
questionContent: string;
parentsCommentId?: number;
commentType: "ANONYMOUS" | "NON_ANONYMOUS";
}
export const postQuestion = async ({
programId,
teamId,
questionContent,
parentsCommentId = -1,
commentType = "NON_ANONYMOUS",
}: PostQuestionParams) => {
return await https({
url: API.QUESTION.CREATE,
method: "POST",
data: { programId, teamId, content: questionContent, parentsCommentId },
data: {
programId,
teamId,
content: questionContent,
parentsCommentId,
commentType,
},
});
};

Expand Down
18 changes: 15 additions & 3 deletions FE/src/app/(admin)/admin/detail/[programId]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import AttendeeInfoContainer from "@/components/programDetail/attendee/AttendeeInfo.container";
import ProgramInfo from "@/components/programDetail/program/ProgramInfo";
import AttendeeInfoContainer from "@/components/feature/detail/attendee/AttendeeInfo.container";
import ProgramHeaderSection from "@/components/feature/detail/program/ProgramHeaderSection";
import ProgramDetailSection from "@/components/feature/detail/program/ProgramDetailSection";
import ProgramattendModeManageSection from "@/components/feature/detail/program/ProgramAttendStatusManageSection";
import ProgramPresentationsSection from "@/components/feature/detail/presentation/ProgramPresentationsSection";
import ProgramDashboardSection from "@/components/feature/detail/Dashboard/ProgramDashboardSection";

interface ProgramDetailPageProps {
params: {
Expand All @@ -12,7 +16,15 @@ const ProgramDetailPage = ({ params }: ProgramDetailPageProps) => {

return (
<div className="mb-16 space-y-16">
<ProgramInfo programId={+programId} accessType="admin" />
<section className="space-y-8">
<ProgramHeaderSection />
<ProgramDetailSection />
<ProgramattendModeManageSection />
<ProgramPresentationsSection />
<div className="mt-12">
<ProgramDashboardSection />
</div>
</section>
<AttendeeInfoContainer programId={+programId} isLoggedIn />
</div>
);
Expand Down
19 changes: 15 additions & 4 deletions FE/src/app/(guest)/guest/detail/[programId]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import AttendeeInfoContainer from "@/components/programDetail/attendee/AttendeeInfo.container";
import ProgramInfo from "@/components/programDetail/program/ProgramInfo";
import UserAttendModalContainer from "@/components/programDetail/userAttendModal/UserAttendModal.container";
import AttendeeInfoContainer from "@/components/feature/detail/attendee/AttendeeInfo.container";
import ProgramHeaderSection from "@/components/feature/detail/program/ProgramHeaderSection";
import ProgramDetailSection from "@/components/feature/detail/program/ProgramDetailSection";
import UserAttendModalContainer from "@/components/feature/detail/userAttendModal/UserAttendModal.container";
import ProgramPresentationsSection from "@/components/feature/detail/presentation/ProgramPresentationsSection";
import BlurDashboard from "@/components/feature/detail/Dashboard/BlurDashboard";

interface ProgramDetailPageProps {
params: {
Expand All @@ -13,10 +16,18 @@ const ProgramDetailPage = ({ params }: ProgramDetailPageProps) => {

return (
<div className="mb-16 space-y-16">
<ProgramInfo programId={+programId} accessType="public" />
<section className="space-y-8">
<ProgramHeaderSection />
<ProgramDetailSection />
<ProgramPresentationsSection />
<div className="mt-12">
<BlurDashboard />
</div>
</section>
<AttendeeInfoContainer programId={+programId} isLoggedIn={false} />
<UserAttendModalContainer programId={+programId} isLoggedIn={false} />
</div>
);
};

export default ProgramDetailPage;
19 changes: 15 additions & 4 deletions FE/src/app/(private)/(program)/detail/[programId]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import AttendeeInfoContainer from "@/components/programDetail/attendee/AttendeeInfo.container";
import ProgramInfo from "@/components/programDetail/program/ProgramInfo";
import UserAttendModalContainer from "@/components/programDetail/userAttendModal/UserAttendModal.container";
import AttendeeInfoContainer from "@/components/feature/detail/attendee/AttendeeInfo.container";
import ProgramHeaderSection from "@/components/feature/detail/program/ProgramHeaderSection";
import ProgramDetailSection from "@/components/feature/detail/program/ProgramDetailSection";
import UserAttendModalContainer from "@/components/feature/detail/userAttendModal/UserAttendModal.container";
import ProgramPresentationsSection from "@/components/feature/detail/presentation/ProgramPresentationsSection";
import ProgramDashboardSection from "@/components/feature/detail/Dashboard/ProgramDashboardSection";

interface ProgramDetailPageProps {
params: {
Expand All @@ -13,10 +16,18 @@ const ProgramDetailPage = ({ params }: ProgramDetailPageProps) => {

return (
<div className="mb-16 space-y-16">
<ProgramInfo programId={+programId} accessType="private" />
<section className="space-y-8">
<ProgramHeaderSection />
<ProgramDetailSection />
<ProgramPresentationsSection />
<div className="mt-12">
<ProgramDashboardSection />
</div>
</section>
<AttendeeInfoContainer programId={+programId} isLoggedIn />
<UserAttendModalContainer programId={+programId} isLoggedIn />
</div>
);
};

export default ProgramDetailPage;
15 changes: 12 additions & 3 deletions FE/src/components/common/CheckBox/CheckBox.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,32 @@
"use client";

import classNames from "classnames";
import Image from "next/image";

interface CheckBoxProps {
checked: boolean;
onClick: () => void;
onClick?: () => void;
disabled?: boolean;
className?: string;
}

const CheckBox = ({ checked, onClick, disabled = false }: CheckBoxProps) => {
const CheckBox = ({
checked,
onClick,
disabled = false,
className,
}: CheckBoxProps) => {
const checkboxClass = classNames(
"flex h-6 w-6 items-center justify-center rounded border-2 transition duration-100",
checked ? "border-blue-500 bg-blue-500" : "border-gray-20 bg-background",
{
"cursor-not-allowed opacity-0": disabled,
},
className,
);

const handleCheckBoxClick = () => {
!disabled && onClick();
!disabled && onClick && onClick();
};

return (
Expand Down
Loading