From d48b816ac8cb96051fa94ddb3c398b79aeb1db85 Mon Sep 17 00:00:00 2001 From: seunghyeon77 Date: Tue, 24 Dec 2024 15:26:08 +0900 Subject: [PATCH 01/12] =?UTF-8?q?feat:=20=EC=9D=B8=EC=A6=9D=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=EC=8B=9C=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20=EC=83=81?= =?UTF-8?q?=EB=8B=A8=20=EA=B3=A0=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_components/ScrollTop.tsx | 14 ++++++++++++++ .../workspaceConfirmaionDetail/page.tsx | 2 ++ 2 files changed, 16 insertions(+) create mode 100644 src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/_components/ScrollTop.tsx diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/_components/ScrollTop.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/_components/ScrollTop.tsx new file mode 100644 index 0000000..9347238 --- /dev/null +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/_components/ScrollTop.tsx @@ -0,0 +1,14 @@ +'use client'; + +import { usePathname } from 'next/navigation'; +import { useEffect } from 'react'; + +export default function ScrollTop() { + const pathName = usePathname(); + + useEffect(() => { + window.scrollTo(0, 0); + }, [pathName]); + + return null; +} diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx index fea5dde..1ad7777 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx @@ -29,6 +29,7 @@ import { import ProgressBar from './_components/ProgressBar'; import RemaineTime from './_components/RemaineTime'; import ConfirmationProfileImg from '../_components/ConfirmationProfileImg'; +import ScrollTop from '../_components/ScrollTop'; export default function Page() { const [reasonInput, setReasonInput] = useState(''); @@ -158,6 +159,7 @@ export default function Page() { return (
+
Date: Thu, 26 Dec 2024 09:24:26 +0900 Subject: [PATCH 02/12] =?UTF-8?q?refactor:=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=20=EC=97=86=EC=9D=84=20=EB=95=8C=20=EB=B3=B4=EC=97=AC=EC=A7=80?= =?UTF-8?q?=EB=8A=94=20UI=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workspaceConfirmation/page.tsx | 65 +++++++++++-------- .../[workspaceId]/workspaceHistory/page.tsx | 10 +-- .../workspace/_components/NoDataUI.tsx | 16 +++++ 3 files changed, 57 insertions(+), 34 deletions(-) create mode 100644 src/app/(afterLogin)/workspace/_components/NoDataUI.tsx diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/page.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/page.tsx index 443a7dd..5dfcb5b 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/page.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/page.tsx @@ -11,13 +11,14 @@ import IsSameDateAsPrevious from './_components/IsSameDataAsPrevious'; import ConfirmationCompo from './_components/ConfirmationCompo'; import useInfiniteQuerys from '@/hooks/workoutConfirmation/ useInfiniteQuerys'; import { useEffect, useRef } from 'react'; +import NoDataUI from '../../_components/NoDataUI'; export default function Page() { const workspaceId = useWorkoutIdFromParams(); const [ref, inView] = useInView({ threshold: 0, delay: 0 }); const scrollBottomRef = useRef(null); - const isInitialRender = useRef(true); + const isInitialRender = useRef(true); const workoutConfirmation = useInfiniteQuerys({ queryKey: ['workoutConfirmations', workspaceId], @@ -35,39 +36,51 @@ export default function Page() { ); useEffect(() => { - if (scrollBottomRef.current && isInitialRender) { + if ( + isInitialRender.current && + workoutConfirmationPages && + workoutConfirmationPages.length + ) { scrollBottomRef.current?.scrollIntoView({ behavior: 'auto' }); isInitialRender.current = false; } }, [workoutConfirmationPages]); return ( -
+
- {workoutConfirmationPages?.map( - ( - workoutConfirmationPage: IWorkoutConfirmationPageProps, - index: number - ) => { - return ( -
- - -
- ); - } + {workoutConfirmationPages?.length === 0 ? ( +
+ +
+ ) : ( +
+ {workoutConfirmationPages?.map( + ( + workoutConfirmationPage: IWorkoutConfirmationPageProps, + index: number + ) => { + return ( +
+ + +
+ ); + } + )} +
)} '} {workspaceHistoryDatas?.data.workoutHistories.length === 0 ? ( -
- noGroup - - 아직 운동 히스토리가 없습니다. - -
+ ) : (
{workspaceHistoryDatas?.data.workoutHistories.map( diff --git a/src/app/(afterLogin)/workspace/_components/NoDataUI.tsx b/src/app/(afterLogin)/workspace/_components/NoDataUI.tsx new file mode 100644 index 0000000..71b795b --- /dev/null +++ b/src/app/(afterLogin)/workspace/_components/NoDataUI.tsx @@ -0,0 +1,16 @@ +import Image from 'next/image'; + +import noGroup from '@/../public/svgs/noGroup.svg'; + +interface INoDataUI { + content: string; +} + +export default function NoDataUI({ content }: INoDataUI) { + return ( +
+ noGroup + {content} +
+ ); +} From a07ddfb22368c745de4799cb773dd6db9b7aa633 Mon Sep 17 00:00:00 2001 From: seunghyeon77 Date: Thu, 26 Dec 2024 10:18:22 +0900 Subject: [PATCH 03/12] =?UTF-8?q?refactor:=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_components/ConfirmationDetailProfile.tsx | 26 +++++++++++++++++++ .../workspaceConfirmaionDetail/page.tsx | 25 ++++++------------ src/types/workoutConfirmation.ts | 9 +++++++ 3 files changed, 43 insertions(+), 17 deletions(-) create mode 100644 src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailProfile.tsx diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailProfile.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailProfile.tsx new file mode 100644 index 0000000..f1feb5e --- /dev/null +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailProfile.tsx @@ -0,0 +1,26 @@ +import ConfirmationProfileImg from '../../_components/ConfirmationProfileImg'; +import { IWorkspaceConfirmationDetailProps } from '@/types/workoutConfirmation'; + +interface IConfirmationDetailProfileProps { + workspaceConfirmationDetail: IWorkspaceConfirmationDetailProps | undefined; +} + +export default function ConfirmationDetailProfile({ + workspaceConfirmationDetail, +}: IConfirmationDetailProfileProps) { + return ( +
+ +
+ + {workspaceConfirmationDetail?.nickname} + + + {workspaceConfirmationDetail?.loginId} + +
+
+ ); +} diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx index 1ad7777..96aa674 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx @@ -28,8 +28,9 @@ import { } from '@/api/workspaceConfirmaion'; import ProgressBar from './_components/ProgressBar'; import RemaineTime from './_components/RemaineTime'; -import ConfirmationProfileImg from '../_components/ConfirmationProfileImg'; import ScrollTop from '../_components/ScrollTop'; +import ConfirmationDetailProfile from './_components/ConfirmationDetailProfile'; +import { IWorkspaceConfirmationDetailProps } from '@/types/workoutConfirmation'; export default function Page() { const [reasonInput, setReasonInput] = useState(''); @@ -45,7 +46,9 @@ export default function Page() { const objectionId = parseInt(seachParams.get('objectionId') || '0', 10); - const { data: workspaceConfirmationDetail } = useQuery({ + const { data: workspaceConfirmationDetail } = useQuery<{ + data: IWorkspaceConfirmationDetailProps; + }>({ queryKey: [ 'workspaceConfimationDetail', workspaceId, @@ -160,21 +163,9 @@ export default function Page() { return (
-
- -
- - {workspaceConfirmationDetail?.data.nickname} - - - {workspaceConfirmationDetail?.data.loginId} - -
-
+
{workspaceConfirmationDetail?.data.comment} diff --git a/src/types/workoutConfirmation.ts b/src/types/workoutConfirmation.ts index 37ba7ae..c389d30 100644 --- a/src/types/workoutConfirmation.ts +++ b/src/types/workoutConfirmation.ts @@ -17,3 +17,12 @@ export interface IWorkoutConfirmationObjectionListPageProps { voteCompletion: boolean; workoutConfirmationId: number; } + +export interface IWorkspaceConfirmationDetailProps { + comment: string; + loginId: string; + nickname: string; + objectionId: number | null; + profileImageUrl: any; + workoutConfirmationImageUrl: any; +} From 97dd776085cceae7932bd962ca63a9efaaf96fd0 Mon Sep 17 00:00:00 2001 From: seunghyeon77 Date: Thu, 26 Dec 2024 10:24:53 +0900 Subject: [PATCH 04/12] =?UTF-8?q?refactor:=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_components/ConfimationDetailImage.tsx | 29 +++++++++++++++++++ .../workspaceConfirmaionDetail/page.tsx | 22 +++----------- 2 files changed, 33 insertions(+), 18 deletions(-) create mode 100644 src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfimationDetailImage.tsx diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfimationDetailImage.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfimationDetailImage.tsx new file mode 100644 index 0000000..ba781e0 --- /dev/null +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfimationDetailImage.tsx @@ -0,0 +1,29 @@ +import Image from 'next/image'; + +import confirmDetailNoImage from '@/../public/svgs/workspace/workspaceConfirmaion/confirmDetailNoImage.svg'; +import { IWorkspaceConfirmationDetailProps } from '@/types/workoutConfirmation'; + +interface IConfirmationDetailImage { + workspaceConfirmationDetail: IWorkspaceConfirmationDetailProps | undefined; +} + +export default function ConfirmationDetailImage({ + workspaceConfirmationDetail, +}: IConfirmationDetailImage) { + return ( +
+ {workspaceConfirmationDetail?.workoutConfirmationImageUrl === '' ? ( + confirmDetailNoImage + ) : ( + Image src} + loading='lazy' + sizes='360px' + fill + /> + )} +
+ ); +} diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx index 96aa674..16fd5af 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx @@ -14,7 +14,6 @@ import { } from '@/components/ui/dialog'; import objectedWorkoutVoteIcon from '@/../public/svgs/workspace/workspaceConfirmaion/objectedWorkoutVoteIcon.svg'; -import confirmDetailNoImage from '@/../public/svgs/workspace/workspaceConfirmaion/confirmDetailNoImage.svg'; import { DialogDescription } from '@radix-ui/react-dialog'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; @@ -31,6 +30,7 @@ import RemaineTime from './_components/RemaineTime'; import ScrollTop from '../_components/ScrollTop'; import ConfirmationDetailProfile from './_components/ConfirmationDetailProfile'; import { IWorkspaceConfirmationDetailProps } from '@/types/workoutConfirmation'; +import ConfirmationDetailImage from './_components/ConfimationDetailImage'; export default function Page() { const [reasonInput, setReasonInput] = useState(''); @@ -170,23 +170,9 @@ export default function Page() { {workspaceConfirmationDetail?.data.comment} -
- {workspaceConfirmationDetail?.data.workoutConfirmationImageUrl === - '' ? ( - confirmDetailNoImage - ) : ( - Image src} - loading='lazy' - sizes='360px' - fill - /> - )} -
+
{/* 이의 신청 팝업창 */} From 3b0de8f285f6cd975295fcc16b54d89d454689fa Mon Sep 17 00:00:00 2001 From: seunghyeon77 Date: Thu, 26 Dec 2024 11:00:42 +0900 Subject: [PATCH 05/12] =?UTF-8?q?refactor:=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=9D=B8=EC=A6=9D=20=ED=88=AC=ED=91=9C=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConfirmationObjectionCompo.tsx | 202 ++++++++++++++++++ .../workspaceConfirmaionDetail/page.tsx | 187 +--------------- src/types/workoutConfirmation.ts | 12 ++ 3 files changed, 222 insertions(+), 179 deletions(-) create mode 100644 src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx new file mode 100644 index 0000000..87ecc11 --- /dev/null +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx @@ -0,0 +1,202 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { useState } from 'react'; + +import Image from 'next/image'; +import { ReadonlyURLSearchParams } from 'next/navigation'; +import { DialogTrigger } from '@/components/ui/dialog'; + +import objectedWorkoutVoteIcon from '@/../public/svgs/workspace/workspaceConfirmaion/objectedWorkoutVoteIcon.svg'; +import ProgressBar from './ProgressBar'; +import RemaineTime from './RemaineTime'; +import { + workoutObjections, + workoutObjectionsVote, +} from '@/api/workspaceConfirmaion'; + +interface IConfirmationObjectionCompo { + seachParams: ReadonlyURLSearchParams; + workspaceId: number; + objectionId: number; +} + +export default function ConfirmationObjectionCompo({ + seachParams, + workspaceId, + objectionId, +}: IConfirmationObjectionCompo) { + console.log(seachParams); + const [isObjectionVote, setIsObjection] = useState(null); + + const isObjection = seachParams.get('isObjection') === 'false'; + + const { data: workoutObjection } = useQuery({ + queryKey: ['workoutObjection', workspaceId, objectionId], + queryFn: () => + workoutObjections({ + workspaceId, + objectionId, + }), + enabled: !isObjection, + }); + + const handleVote = (isObjection: boolean) => { + setIsObjection((prev) => (prev === isObjection ? null : isObjection)); + }; + + const queryClient = useQueryClient(); + + const OBJECTTIONVOTE_QUERYKEY = { + workoutObjection: (workspaceId: number, objectionId: number) => [ + 'workoutObjection', + workspaceId, + objectionId, + ], + }; + + const objectionVote = useMutation({ + mutationFn: workoutObjectionsVote, + onSuccess: (data) => { + console.log('Success:', data); + alert('이의 신청 투표가 성공적으로 제출되었습니다.'); + + queryClient.invalidateQueries({ + queryKey: OBJECTTIONVOTE_QUERYKEY.workoutObjection( + workspaceId, + objectionId + ), + }); + }, + + onError: (error) => { + console.error('Error:', error); + alert('이의 신청 투표 중 오류가 발생했습니다.'); + }, + }); + + const handleVotePost = (event: React.MouseEvent) => { + event.preventDefault(); + + if (isObjectionVote === null) { + alert('이의신청 투표를 진행해주세요.'); + } + + if (isObjectionVote !== null) { + objectionVote.mutate({ + workspaceId, + objectionId, + objectionVote: isObjectionVote, + }); + } + }; + + const appovalCount = + (workoutObjection?.data.approvalCount / workoutObjection?.data.headCount) * + 100; + const rejectionCount = + (workoutObjection?.data.rejectionCount / workoutObjection?.data.headCount) * + 100; + if (appovalCount > 100 || rejectionCount > 100) { + appovalCount === 100 || rejectionCount === 100; + } + + return ( +
+ {isObjection ? ( +
+ + + +
+ ) : ( +
+
+ objectedWorkoutVoteIcon + + {!workoutObjection?.data.inInProgress + ? `투표 결과: ${ + workoutObjection?.data.confirmationCompletion + ? '찬성' + : '반대' + }` + : '이의 신청 투표'} + +
+

+ {workoutObjection?.data.reason} +

+
+ + {!workoutObjection?.data.inInProgress ? ( + '투표 종료' + ) : ( + <> + 투표 종료까지{' '} + + + )} + {' * '} + {workoutObjection?.data.voteParticipationCount}명 참여 + +
+ {!workoutObjection?.data.inInProgress ? ( +
+ 투표 종료 +
+ ) : ( +
+ { + if (!workoutObjection?.data.voteCompletion) handleVote(true); + }} + isObjectionVote={isObjectionVote === true} + /> + { + if (!workoutObjection?.data.voteCompletion) handleVote(false); + }} + isObjectionVote={isObjectionVote === false} + /> +
+ {workoutObjection?.data.voteCompletion ? ( +
투표완료
+ ) : ( + + )} +
+
+ )} +
+ )} +
+ ); +} diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx index 16fd5af..ad52a72 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx @@ -1,6 +1,5 @@ 'use client'; -import Image from 'next/image'; import { useState } from 'react'; import { @@ -10,31 +9,25 @@ import { DialogFooter, DialogHeader, DialogTitle, - DialogTrigger, } from '@/components/ui/dialog'; -import objectedWorkoutVoteIcon from '@/../public/svgs/workspace/workspaceConfirmaion/objectedWorkoutVoteIcon.svg'; - import { DialogDescription } from '@radix-ui/react-dialog'; -import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { useMutation, useQuery } from '@tanstack/react-query'; import { useRouter, useSearchParams } from 'next/navigation'; import useWorkoutIdFromParams from '@/hooks/workoutHistory/useWorkoutIdFromParams'; import { workoutConfirmaionsDetail, workoutObjectionReason, - workoutObjections, - workoutObjectionsVote, } from '@/api/workspaceConfirmaion'; -import ProgressBar from './_components/ProgressBar'; -import RemaineTime from './_components/RemaineTime'; + import ScrollTop from '../_components/ScrollTop'; import ConfirmationDetailProfile from './_components/ConfirmationDetailProfile'; import { IWorkspaceConfirmationDetailProps } from '@/types/workoutConfirmation'; import ConfirmationDetailImage from './_components/ConfimationDetailImage'; +import ConfirmationobjectionCompo from './_components/ConfirmationObjectionCompo'; export default function Page() { const [reasonInput, setReasonInput] = useState(''); - const [isObjectionVote, setIsObjection] = useState(null); const router = useRouter(); const workspaceId = useWorkoutIdFromParams(); const seachParams = useSearchParams(); @@ -42,7 +35,6 @@ export default function Page() { seachParams.get('workoutConfirmationId') || '0', 10 ); - const isObjection = seachParams.get('isObjection') === 'false'; const objectionId = parseInt(seachParams.get('objectionId') || '0', 10); @@ -61,18 +53,6 @@ export default function Page() { }), }); - const { data: workoutObjection } = useQuery({ - queryKey: ['workoutObjection', workspaceId, objectionId], - queryFn: () => - workoutObjections({ - workspaceId, - objectionId, - }), - enabled: !isObjection, - }); - - const queryClient = useQueryClient(); - const objectionReason = useMutation({ mutationFn: workoutObjectionReason, onSuccess: (data) => { @@ -102,64 +82,6 @@ export default function Page() { } }; - const handleVote = (isObjection: boolean) => { - setIsObjection((prev) => (prev === isObjection ? null : isObjection)); - }; - - const OBJECTTIONVOTE_QUERYKEY = { - workoutObjection: (workspaceId: number, objectionId: number) => [ - 'workoutObjection', - workspaceId, - objectionId, - ], - }; - - const objectionVote = useMutation({ - mutationFn: workoutObjectionsVote, - onSuccess: (data) => { - console.log('Success:', data); - alert('이의 신청 투표가 성공적으로 제출되었습니다.'); - - queryClient.invalidateQueries({ - queryKey: OBJECTTIONVOTE_QUERYKEY.workoutObjection( - workspaceId, - objectionId - ), - }); - }, - - onError: (error) => { - console.error('Error:', error); - alert('이의 신청 투표 중 오류가 발생했습니다.'); - }, - }); - - const handleVotePost = (event: React.MouseEvent) => { - event.preventDefault(); - - if (isObjectionVote === null) { - alert('이의신청 투표를 진행해주세요.'); - } - - if (isObjectionVote !== null) { - objectionVote.mutate({ - workspaceId, - objectionId, - objectionVote: isObjectionVote, - }); - } - }; - - const appovalCount = - (workoutObjection?.data.approvalCount / workoutObjection?.data.headCount) * - 100; - const rejectionCount = - (workoutObjection?.data.rejectionCount / workoutObjection?.data.headCount) * - 100; - if (appovalCount > 100 || rejectionCount > 100) { - appovalCount === 100 || rejectionCount === 100; - } - return (
@@ -177,104 +99,11 @@ export default function Page() { {/* 이의 신청 팝업창 */} - {isObjection ? ( -
- - - -
- ) : ( -
-
- objectedWorkoutVoteIcon - - {!workoutObjection?.data.inInProgress - ? `투표 결과: ${ - workoutObjection?.data.confirmationCompletion - ? '찬성' - : '반대' - }` - : '이의 신청 투표'} - -
-

- {workoutObjection?.data.reason} -

-
- - {!workoutObjection?.data.inInProgress ? ( - '투표 종료' - ) : ( - <> - 투표 종료까지{' '} - - - )} - {' * '} - {workoutObjection?.data.voteParticipationCount}명 참여 - -
- {!workoutObjection?.data.inInProgress ? ( -
- 투표 종료 -
- ) : ( - <> - { - if (!workoutObjection?.data.voteCompletion) - handleVote(true); - }} - isObjectionVote={isObjectionVote === true} - /> - { - if (!workoutObjection?.data.voteCompletion) - handleVote(false); - }} - isObjectionVote={isObjectionVote === false} - /> -
- {workoutObjection?.data.voteCompletion ? ( -
투표완료
- ) : ( - - )} -
- - )} -
- )} + Date: Thu, 26 Dec 2024 11:11:05 +0900 Subject: [PATCH 06/12] =?UTF-8?q?refactor:=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EB=82=B4=EC=9A=A9=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_components/ConfirmationDetailCompo.tsx | 46 +++++++++++++++++++ .../ConfirmationObjectionCompo.tsx | 5 +- .../workspaceConfirmaionDetail/page.tsx | 40 ++-------------- 3 files changed, 52 insertions(+), 39 deletions(-) create mode 100644 src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailCompo.tsx diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailCompo.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailCompo.tsx new file mode 100644 index 0000000..bd38efd --- /dev/null +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailCompo.tsx @@ -0,0 +1,46 @@ +import { useQuery } from '@tanstack/react-query'; +import ConfirmationDetailImage from './ConfimationDetailImage'; +import ConfirmationDetailProfile from './ConfirmationDetailProfile'; +import { IWorkspaceConfirmationDetailProps } from '@/types/workoutConfirmation'; +import useWorkoutIdFromParams from '@/hooks/workoutHistory/useWorkoutIdFromParams'; +import { workoutConfirmaionsDetail } from '@/api/workspaceConfirmaion'; + +interface IConfirmationDetailCompoProps { + workoutConfirmationId: number; +} + +export default function ConfirmationDetailCompo({ + workoutConfirmationId, +}: IConfirmationDetailCompoProps) { + const workspaceId = useWorkoutIdFromParams(); + + const { data: workspaceConfirmationDetail } = useQuery<{ + data: IWorkspaceConfirmationDetailProps; + }>({ + queryKey: [ + 'workspaceConfimationDetail', + workspaceId, + workoutConfirmationId, + ], + queryFn: () => + workoutConfirmaionsDetail({ + workspaceId, + workoutConfirmationId, + }), + }); + return ( +
+ +
+ + {workspaceConfirmationDetail?.data.comment} + + +
+
+ ); +} diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx index 87ecc11..6ff2be2 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx @@ -12,20 +12,19 @@ import { workoutObjections, workoutObjectionsVote, } from '@/api/workspaceConfirmaion'; +import useWorkoutIdFromParams from '@/hooks/workoutHistory/useWorkoutIdFromParams'; interface IConfirmationObjectionCompo { seachParams: ReadonlyURLSearchParams; - workspaceId: number; objectionId: number; } export default function ConfirmationObjectionCompo({ seachParams, - workspaceId, objectionId, }: IConfirmationObjectionCompo) { - console.log(seachParams); const [isObjectionVote, setIsObjection] = useState(null); + const workspaceId = useWorkoutIdFromParams(); const isObjection = seachParams.get('isObjection') === 'false'; diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx index ad52a72..5343162 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx @@ -12,19 +12,14 @@ import { } from '@/components/ui/dialog'; import { DialogDescription } from '@radix-ui/react-dialog'; -import { useMutation, useQuery } from '@tanstack/react-query'; +import { useMutation } from '@tanstack/react-query'; import { useRouter, useSearchParams } from 'next/navigation'; import useWorkoutIdFromParams from '@/hooks/workoutHistory/useWorkoutIdFromParams'; -import { - workoutConfirmaionsDetail, - workoutObjectionReason, -} from '@/api/workspaceConfirmaion'; +import { workoutObjectionReason } from '@/api/workspaceConfirmaion'; import ScrollTop from '../_components/ScrollTop'; -import ConfirmationDetailProfile from './_components/ConfirmationDetailProfile'; -import { IWorkspaceConfirmationDetailProps } from '@/types/workoutConfirmation'; -import ConfirmationDetailImage from './_components/ConfimationDetailImage'; import ConfirmationobjectionCompo from './_components/ConfirmationObjectionCompo'; +import ConfirmationDetailCompo from './_components/ConfirmationDetailCompo'; export default function Page() { const [reasonInput, setReasonInput] = useState(''); @@ -35,24 +30,8 @@ export default function Page() { seachParams.get('workoutConfirmationId') || '0', 10 ); - const objectionId = parseInt(seachParams.get('objectionId') || '0', 10); - const { data: workspaceConfirmationDetail } = useQuery<{ - data: IWorkspaceConfirmationDetailProps; - }>({ - queryKey: [ - 'workspaceConfimationDetail', - workspaceId, - workoutConfirmationId, - ], - queryFn: () => - workoutConfirmaionsDetail({ - workspaceId, - workoutConfirmationId, - }), - }); - const objectionReason = useMutation({ mutationFn: workoutObjectionReason, onSuccess: (data) => { @@ -85,23 +64,12 @@ export default function Page() { return (
- -
- - {workspaceConfirmationDetail?.data.comment} - - -
+ {/* 이의 신청 팝업창 */} From e449134fee4763871af2d9a2fecd8a10c5dfd7a7 Mon Sep 17 00:00:00 2001 From: seunghyeon77 Date: Thu, 26 Dec 2024 11:23:13 +0900 Subject: [PATCH 07/12] =?UTF-8?q?refactor:=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4?= =?UTF-8?q?=EC=9D=98=20=EC=8B=A0=EC=B2=AD=20=EC=9E=85=EB=A0=A5=20=ED=8C=9D?= =?UTF-8?q?=EC=97=85=EC=B0=BD=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_components/ConfirmationDetailCompo.tsx | 1 + .../ConfirmationDetailObjectionInput.tsx | 100 +++++++++++++++++ .../ConfirmationObjectionCompo.tsx | 5 +- .../workspaceConfirmaionDetail/page.tsx | 104 ++---------------- 4 files changed, 111 insertions(+), 99 deletions(-) create mode 100644 src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailObjectionInput.tsx diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailCompo.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailCompo.tsx index bd38efd..54eaebf 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailCompo.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailCompo.tsx @@ -1,4 +1,5 @@ import { useQuery } from '@tanstack/react-query'; + import ConfirmationDetailImage from './ConfimationDetailImage'; import ConfirmationDetailProfile from './ConfirmationDetailProfile'; import { IWorkspaceConfirmationDetailProps } from '@/types/workoutConfirmation'; diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailObjectionInput.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailObjectionInput.tsx new file mode 100644 index 0000000..9567ebd --- /dev/null +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailObjectionInput.tsx @@ -0,0 +1,100 @@ +import { workoutObjectionReason } from '@/api/workspaceConfirmaion'; +import { + DialogClose, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; +import useWorkoutIdFromParams from '@/hooks/workoutHistory/useWorkoutIdFromParams'; +import { DialogDescription } from '@radix-ui/react-dialog'; +import { useMutation } from '@tanstack/react-query'; +import { useRouter } from 'next/navigation'; +import { useState } from 'react'; + +interface IConfirmationDetailObjectionInputProps { + workoutConfirmationId: number; +} + +export default function ConfirmationDetailObjectionInput({ + workoutConfirmationId, +}: IConfirmationDetailObjectionInputProps) { + const router = useRouter(); + const [reasonInput, setReasonInput] = useState(''); + const workspaceId = useWorkoutIdFromParams(); + + const objectionReason = useMutation({ + mutationFn: workoutObjectionReason, + onSuccess: (data) => { + console.log('Success:', data); + alert('이의 신청이 성공적으로 제출되었습니다.'); + router.push(`/workspace/${workspaceId}/workspaceConfirmation`); + }, + onError: (error) => { + console.error('Error:', error); + alert('이의 신청 제출 중 오류가 발생했습니다.'); + }, + }); + + const handleReasonPost = (event: React.MouseEvent) => { + event.preventDefault(); + + if (reasonInput.length < 10) { + alert('10자 이상 작성하셔야 합니다.'); + } + + if (reasonInput.length >= 10) { + objectionReason.mutate({ + workspaceId, + workoutConfirmationId, + objectionReason: reasonInput, + }); + } + }; + + return ( + + + + + 이의 신청 이유를 입력해주세요. + + +
+ setReasonInput(e.target.value)} + /> + {reasonInput.length <= 10 ? ( + + 이의 신청 이유는 10자 이상 작성해주세요. + + ) : ( + <> + )} +
+ +
+
+
+ + cancel + +
+ +
+
+
+
+ ); +} diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx index 6ff2be2..6440e2d 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx @@ -1,5 +1,5 @@ -import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useState } from 'react'; +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import Image from 'next/image'; import { ReadonlyURLSearchParams } from 'next/navigation'; @@ -16,15 +16,14 @@ import useWorkoutIdFromParams from '@/hooks/workoutHistory/useWorkoutIdFromParam interface IConfirmationObjectionCompo { seachParams: ReadonlyURLSearchParams; - objectionId: number; } export default function ConfirmationObjectionCompo({ seachParams, - objectionId, }: IConfirmationObjectionCompo) { const [isObjectionVote, setIsObjection] = useState(null); const workspaceId = useWorkoutIdFromParams(); + const objectionId = parseInt(seachParams.get('objectionId') || '0', 10); const isObjection = seachParams.get('isObjection') === 'false'; diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx index 5343162..6f8166d 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx @@ -1,65 +1,20 @@ 'use client'; -import { useState } from 'react'; +import { Dialog } from '@/components/ui/dialog'; -import { - Dialog, - DialogClose, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle, -} from '@/components/ui/dialog'; - -import { DialogDescription } from '@radix-ui/react-dialog'; -import { useMutation } from '@tanstack/react-query'; -import { useRouter, useSearchParams } from 'next/navigation'; -import useWorkoutIdFromParams from '@/hooks/workoutHistory/useWorkoutIdFromParams'; -import { workoutObjectionReason } from '@/api/workspaceConfirmaion'; +import { useSearchParams } from 'next/navigation'; import ScrollTop from '../_components/ScrollTop'; -import ConfirmationobjectionCompo from './_components/ConfirmationObjectionCompo'; +import ConfirmationObjectionCompo from './_components/ConfirmationObjectionCompo'; import ConfirmationDetailCompo from './_components/ConfirmationDetailCompo'; +import ConfirmationDetailObjectionInput from './_components/ConfirmationDetailObjectionInput'; export default function Page() { - const [reasonInput, setReasonInput] = useState(''); - const router = useRouter(); - const workspaceId = useWorkoutIdFromParams(); const seachParams = useSearchParams(); const workoutConfirmationId = parseInt( seachParams.get('workoutConfirmationId') || '0', 10 ); - const objectionId = parseInt(seachParams.get('objectionId') || '0', 10); - - const objectionReason = useMutation({ - mutationFn: workoutObjectionReason, - onSuccess: (data) => { - console.log('Success:', data); - alert('이의 신청이 성공적으로 제출되었습니다.'); - router.push(`/workspace/${workspaceId}/workspaceConfirmation`); - }, - onError: (error) => { - console.error('Error:', error); - alert('이의 신청 제출 중 오류가 발생했습니다.'); - }, - }); - - const handleReasonPost = (event: React.MouseEvent) => { - event.preventDefault(); - - if (reasonInput.length < 10) { - alert('10자 이상 작성하셔야 합니다.'); - } - - if (reasonInput.length >= 10) { - objectionReason.mutate({ - workspaceId, - workoutConfirmationId, - objectionReason: reasonInput, - }); - } - }; return (
@@ -68,54 +23,11 @@ export default function Page() { {/* 이의 신청 팝업창 */} - + - - - - - 이의 신청 이유를 입력해주세요. - - -
- setReasonInput(e.target.value)} - /> - {reasonInput.length <= 10 ? ( - - 이의 신청 이유는 10자 이상 작성해주세요. - - ) : ( - <> - )} -
- -
-
-
- - cancel - -
- -
-
-
-
+
); From 15be87b46cfe78524d5856823d212a1ceaef8e58 Mon Sep 17 00:00:00 2001 From: seunghyeon77 Date: Thu, 26 Dec 2024 11:29:47 +0900 Subject: [PATCH 08/12] =?UTF-8?q?refactor:=20=EC=83=81=EB=8B=A8=EC=97=90?= =?UTF-8?q?=20'use=20client'=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_components/ConfirmationDetailCompo.tsx | 2 ++ .../_components/ConfirmationDetailObjectionInput.tsx | 4 +++- .../_components/ConfirmationObjectionCompo.tsx | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailCompo.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailCompo.tsx index 54eaebf..5a3923e 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailCompo.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailCompo.tsx @@ -1,3 +1,5 @@ +'use client'; + import { useQuery } from '@tanstack/react-query'; import ConfirmationDetailImage from './ConfimationDetailImage'; diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailObjectionInput.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailObjectionInput.tsx index 9567ebd..76c49c7 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailObjectionInput.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationDetailObjectionInput.tsx @@ -1,3 +1,5 @@ +'use client'; + import { workoutObjectionReason } from '@/api/workspaceConfirmaion'; import { DialogClose, @@ -55,7 +57,7 @@ export default function ConfirmationDetailObjectionInput({ return ( diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx index 6440e2d..b60d9d4 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx @@ -1,3 +1,5 @@ +'use client'; + import { useState } from 'react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; From 655ce66178fe389f7af1e4a20c2136feec55a5ea Mon Sep 17 00:00:00 2001 From: seunghyeon77 Date: Thu, 26 Dec 2024 15:30:43 +0900 Subject: [PATCH 09/12] =?UTF-8?q?refactor:=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=9D=B8=EC=A6=9D=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=EC=97=90=EC=84=9C=20progressBar=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConfirmationObjectionCompo.tsx | 60 ++++++------------- .../ConfirmationObjectionProgressBars.tsx | 48 +++++++++++++++ .../workspaceConfirmaionDetail/page.tsx | 2 +- 3 files changed, 68 insertions(+), 42 deletions(-) rename src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/{ => confirmationObjection}/ConfirmationObjectionCompo.tsx (77%) create mode 100644 src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/confirmationObjection/ConfirmationObjectionProgressBars.tsx diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/confirmationObjection/ConfirmationObjectionCompo.tsx similarity index 77% rename from src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx rename to src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/confirmationObjection/ConfirmationObjectionCompo.tsx index b60d9d4..e87918e 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/ConfirmationObjectionCompo.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/_components/confirmationObjection/ConfirmationObjectionCompo.tsx @@ -8,13 +8,14 @@ import { ReadonlyURLSearchParams } from 'next/navigation'; import { DialogTrigger } from '@/components/ui/dialog'; import objectedWorkoutVoteIcon from '@/../public/svgs/workspace/workspaceConfirmaion/objectedWorkoutVoteIcon.svg'; -import ProgressBar from './ProgressBar'; -import RemaineTime from './RemaineTime'; +import RemaineTime from '../RemaineTime'; import { workoutObjections, workoutObjectionsVote, } from '@/api/workspaceConfirmaion'; import useWorkoutIdFromParams from '@/hooks/workoutHistory/useWorkoutIdFromParams'; +import ConfirmationObjectionProgressBars from './ConfirmationObjectionProgressBars'; +import { IWorkoutObjectionProps } from '@/types/workoutConfirmation'; interface IConfirmationObjectionCompo { seachParams: ReadonlyURLSearchParams; @@ -23,25 +24,23 @@ interface IConfirmationObjectionCompo { export default function ConfirmationObjectionCompo({ seachParams, }: IConfirmationObjectionCompo) { - const [isObjectionVote, setIsObjection] = useState(null); const workspaceId = useWorkoutIdFromParams(); + const [isObjectionVote, setIsObjectionVote] = useState(null); const objectionId = parseInt(seachParams.get('objectionId') || '0', 10); const isObjection = seachParams.get('isObjection') === 'false'; - const { data: workoutObjection } = useQuery({ - queryKey: ['workoutObjection', workspaceId, objectionId], - queryFn: () => - workoutObjections({ - workspaceId, - objectionId, - }), - enabled: !isObjection, - }); - - const handleVote = (isObjection: boolean) => { - setIsObjection((prev) => (prev === isObjection ? null : isObjection)); - }; + const { data: workoutObjection } = useQuery<{ data: IWorkoutObjectionProps }>( + { + queryKey: ['workoutObjection', workspaceId, objectionId], + queryFn: () => + workoutObjections({ + workspaceId, + objectionId, + }), + enabled: !isObjection, + } + ); const queryClient = useQueryClient(); @@ -89,16 +88,6 @@ export default function ConfirmationObjectionCompo({ } }; - const appovalCount = - (workoutObjection?.data.approvalCount / workoutObjection?.data.headCount) * - 100; - const rejectionCount = - (workoutObjection?.data.rejectionCount / workoutObjection?.data.headCount) * - 100; - if (appovalCount > 100 || rejectionCount > 100) { - appovalCount === 100 || rejectionCount === 100; - } - return (
{isObjection ? ( @@ -157,21 +146,10 @@ export default function ConfirmationObjectionCompo({
) : (
- { - if (!workoutObjection?.data.voteCompletion) handleVote(true); - }} - isObjectionVote={isObjectionVote === true} - /> - { - if (!workoutObjection?.data.voteCompletion) handleVote(false); - }} - isObjectionVote={isObjectionVote === false} +
>; + workoutObjection: IWorkoutObjectionProps; +} + +export default function ConfirmationObjectionProgressBars({ + isObjectionVote, + setIsObjectionVote, + workoutObjection, +}: IConfirmationObjectionProgressBarsProps) { + const handleVote = (isObjection: boolean) => { + setIsObjectionVote((prev) => (prev === isObjection ? null : isObjection)); + }; + + const appovalCount = + (workoutObjection?.approvalCount / workoutObjection?.headCount) * 100; + const rejectionCount = + (workoutObjection?.rejectionCount / workoutObjection?.headCount) * 100; + + if (appovalCount > 100 || rejectionCount > 100) { + appovalCount === 100 || rejectionCount === 100; + } + return ( +
+ { + if (!workoutObjection?.voteCompletion) handleVote(true); + }} + isObjectionVote={isObjectionVote === true} + /> + { + if (!workoutObjection?.voteCompletion) handleVote(false); + }} + isObjectionVote={isObjectionVote === false} + /> +
+ ); +} diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx index 6f8166d..78f3197 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/workspaceConfirmaionDetail/page.tsx @@ -5,7 +5,7 @@ import { Dialog } from '@/components/ui/dialog'; import { useSearchParams } from 'next/navigation'; import ScrollTop from '../_components/ScrollTop'; -import ConfirmationObjectionCompo from './_components/ConfirmationObjectionCompo'; +import ConfirmationObjectionCompo from './_components/confirmationObjection/ConfirmationObjectionCompo'; import ConfirmationDetailCompo from './_components/ConfirmationDetailCompo'; import ConfirmationDetailObjectionInput from './_components/ConfirmationDetailObjectionInput'; From 4ba649cbaa7745a1b9233734fbdf3108dc752d83 Mon Sep 17 00:00:00 2001 From: seunghyeon77 Date: Thu, 26 Dec 2024 15:52:26 +0900 Subject: [PATCH 10/12] =?UTF-8?q?refactor:=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=93=B1=EB=A1=9D=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_components/ConfirmationCompo.tsx | 13 ++++-------- .../_components/ConfirmationCompoTime.tsx | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/_components/ConfirmationCompoTime.tsx diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/_components/ConfirmationCompo.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/_components/ConfirmationCompo.tsx index 32e6be0..cf85c96 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/_components/ConfirmationCompo.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/_components/ConfirmationCompo.tsx @@ -2,6 +2,7 @@ import { IWorkoutConfirmationPageProps } from '@/types/workoutConfirmation'; import ConfirmationProfile from './ConfirmationProfile'; import ConfirmationCompoObjection from './ConfirmationCompoObjection'; import ConfirmationCompoConfirm from './ConfirmationCompoConfirm'; +import ConfirmationCompoTime from './ConfirmationCompoTime'; interface IConfirmationCompoProps { workoutConfirmationPage: IWorkoutConfirmationPageProps; @@ -30,15 +31,9 @@ export default function ConfirmationCompo({ workspaceId={workspaceId} /> )} -
- - {workoutConfirmationPage.createdAt.substring(11, 16)} - -
+
); diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/_components/ConfirmationCompoTime.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/_components/ConfirmationCompoTime.tsx new file mode 100644 index 0000000..10a30c1 --- /dev/null +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/_components/ConfirmationCompoTime.tsx @@ -0,0 +1,21 @@ +import { IWorkoutConfirmationPageProps } from '@/types/workoutConfirmation'; + +interface IConfirmationPageProps { + workoutConfirmationPage: IWorkoutConfirmationPageProps; +} + +export default function ConfirmationCompoTime({ + workoutConfirmationPage, +}: IConfirmationPageProps) { + return ( +
+ + {workoutConfirmationPage.createdAt.substring(11, 16)} + +
+ ); +} From 3571b5e610b488712cefd8cf1a687db63173f504 Mon Sep 17 00:00:00 2001 From: seunghyeon77 Date: Fri, 27 Dec 2024 13:19:58 +0900 Subject: [PATCH 11/12] =?UTF-8?q?feat:=20=EC=9A=B4=EB=8F=99=20=ED=9E=88?= =?UTF-8?q?=EC=8A=A4=ED=86=A0=EB=A6=AC=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EC=8B=9C=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20?= =?UTF-8?q?=EC=83=81=EB=8B=A8=20=EA=B3=A0=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workspace/[workspaceId]/workspaceHistory/page.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceHistory/page.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceHistory/page.tsx index 462b136..195529c 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceHistory/page.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceHistory/page.tsx @@ -16,6 +16,7 @@ import useWorkoutIdFromParams from '@/hooks/workoutHistory/useWorkoutIdFromParam import type { THistorys, TQueryTypes } from '@/types/workspaceHistory'; import NoDataUI from '../../_components/NoDataUI'; +import ScrollTop from '../workspaceConfirmation/_components/ScrollTop'; function useUserInfo(): TQueryTypes { const searchParams = useSearchParams(); @@ -57,6 +58,7 @@ function Page() { return (
+ Date: Sun, 29 Dec 2024 00:19:31 +0900 Subject: [PATCH 12/12] =?UTF-8?q?refactor:=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20?= =?UTF-8?q?=ED=95=98=EB=8B=A8=20=EA=B3=A0=EC=A0=95=20=EB=B0=8F=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EB=A7=A4=ED=95=91=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workspaceConfirmation/page.tsx | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/page.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/page.tsx index 5dfcb5b..cab5f6a 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/page.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/workspaceConfirmation/page.tsx @@ -10,12 +10,17 @@ import ObjectionBell from './_components/ObjectionBell'; import IsSameDateAsPrevious from './_components/IsSameDataAsPrevious'; import ConfirmationCompo from './_components/ConfirmationCompo'; import useInfiniteQuerys from '@/hooks/workoutConfirmation/ useInfiniteQuerys'; -import { useEffect, useRef } from 'react'; +import { useEffect, useRef, useState } from 'react'; import NoDataUI from '../../_components/NoDataUI'; export default function Page() { const workspaceId = useWorkoutIdFromParams(); - const [ref, inView] = useInView({ threshold: 0, delay: 0 }); + const [initialObserve, setInitialObserve] = useState(false); + + const [ref, inView] = useInView({ + threshold: 0.1, + delay: 500, + }); const scrollBottomRef = useRef(null); const isInitialRender = useRef(true); @@ -24,12 +29,14 @@ export default function Page() { queryKey: ['workoutConfirmations', workspaceId], dataReqFn: workoutConfirmations, params: { workspaceId }, - inView, + inView: inView && initialObserve, }); - const workoutConfirmationPages = workoutConfirmation?.pages.flatMap( - (pages) => pages.data.data - ); + const workoutConfirmationPages = workoutConfirmation?.pages + .slice() + .reverse() + .flatMap((pages) => pages.data.data); + const workoutConfirmationVoteInCompletionCount = workoutConfirmation?.pages.flatMap( (pages) => pages.data.voteIncompletionCount @@ -40,15 +47,20 @@ export default function Page() { isInitialRender.current && workoutConfirmationPages && workoutConfirmationPages.length - ) { - scrollBottomRef.current?.scrollIntoView({ behavior: 'auto' }); - isInitialRender.current = false; - } + ) + setTimeout(() => { + scrollBottomRef.current?.scrollIntoView({ + behavior: 'auto', + }); + isInitialRender.current = false; + setTimeout(() => { + setInitialObserve(true); + }, 100); + }, 100); }, [workoutConfirmationPages]); return ( -
-
+
{workoutConfirmationPages?.length === 0 ? (
@@ -56,6 +68,7 @@ export default function Page() {
) : (
+
{workoutConfirmationPages?.map( ( workoutConfirmationPage: IWorkoutConfirmationPageProps, @@ -80,6 +93,7 @@ export default function Page() { ); } )} +
)}
-
); }