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

Feat: 일정 채우기 페이지 구현 #52

Open
wants to merge 77 commits into
base: develop
Choose a base branch
from

Conversation

Choi-Jinwook
Copy link
Contributor

@Choi-Jinwook Choi-Jinwook commented Nov 25, 2023

변경사항

  • 일정 채우기 페이지 구현(Figma 일정만들기_4)

Test

  • localhost:3000/create-schedule

TODO

  • progress 2에서 날짜가 비었을 경우 타임 테이블 날짜 표시에 대해 논의
  • 타임 테이블 기획, 디자인 수정 시 변경 내용 적용
  • 템플릿 클릭 시 템플릿 미리보기 모달

);
};

export default TemplatePreview;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰를 위해 주어진 코드 패치를 살펴보면 다음과 같습니다:

  1. import 문에서 @create-schedule/components@shared/hook 모듈을 가져오고 있습니다.
  2. TemplatePreview 함수 컴포넌트가 정의되어 있습니다.
  3. useModal 훅에서 closeModal을 사용하고 있습니다.
  4. currentDate 변수에 현재 날짜로 초기화된 Date 객체가 할당되고 있습니다. 하지만 // TODO: 날짜 받아오기라는 주석이 추가되어 있으므로, 실제로는 외부에서 날짜를 받아와야할 것으로 보입니다.
  5. JSX를 통해 UI를 렌더링하고 있습니다.
  6. <CurrentDate> 컴포넌트에 currentDate prop으로 currentDate 값을 전달하고 있습니다.
  7. <TimeTable> 컴포넌트에 callType="template" prop으로 값을 전달하고 있습니다. 그러나 TODO: initialData 받아오기라는 주석이 추가되어 있어 초기 데이터를 받아와야할 것으로 보입니다.
  8. 확인 버튼을 클릭하면 closeModal 함수가 호출됩니다.

버그 또는 개선 제안:

  • TODO 주석에 따라서 날짜와 초기 데이터를 얻는 부분을 구현해야 합니다.
  • UI 요소의 스타일 및 레이아웃을 검토하여 개선할 수 있는 부분이 있는지 확인해야 합니다.
  • 코드에서 주석을 줄이고 가독성을 높이는 것이 좋습니다. 주석은 필요한 경우에만 사용하는 것이 좋습니다.

이러한 점들을 고려하여 코드를 수정하면 될 것 같습니다.


interface MakeScheduleButtonProps extends HTMLAttributes<HTMLButtonElement> {
interface MakeScheduleButtonProps
extends ButtonHTMLAttributes<HTMLButtonElement> {
value: string;
buttonStyle: string;
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

주어진 코드 패치에 대해 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험 요소 및 개선 제안을 환영합니다:

  • react에서 HTMLAttributes를 가져오는 대신 ButtonHTMLAttributes를 가져오는 것으로 수정되었습니다.
  • MakeScheduleButtonProps 인터페이스가 확장됩니다. HTMLButtonElement에 대한 속성을 가집니다.
  • valuebuttonStyle 속성이 추가되었습니다.

개선 사항:

  • buttonStyle을 문자열 대신 열거형(enum)으로 정의하는 것이 타입 안정성에 도움이 될 수 있습니다.
  • 다른 속성(예: onClick)도 필요한 경우 해당 속성을 인터페이스에 추가하는 것이 좋습니다.

이 외에는 주요한 문제점은 없어 보입니다.

isClicked={isClicked}
onClick={onClick}
/>
);
};

export default Template;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

위의 코드 패치는 Template 컴포넌트와 관련되어 있습니다. 컴포넌트에 대한 간단한 코드 리뷰를 도와드리겠습니다.

버그 주의 사항:

  1. isClickedonClickTemplateProps 인터페이스의 속성으로 지정되었습니다. 그러나 실제로는 isClicked라는 속성이 존재하지 않습니다. 이 문제를 해결하려면 ScheduleCard 컴포넌트에 isClicked 속성을 추가해야 합니다.

개선 제안:

  1. isClicked 에서 불린 값 대신에, "template""custom" 키를 가진 객체가 전달되도록 하는 것이 좋을 수 있습니다.
  2. onClick에 있는 키 타입 정의를 개선하여 타입 안정성을 확보할 수 있습니다.

아래는 개선된 코드 예시입니다:

import { templateContent } from "@create-schedule/constants";
import { ScheduleCard } from "@shared/components";

interface TemplateProps {
  activeType: "template" | "custom";
  onClick: (key: "template" | "custom") => void;
}

const Template = ({ activeType, onClick }: TemplateProps) => {
  return (
    <ScheduleCard
      content={templateContent}
      callType="template"
      isClicked={{ template: activeType === "template", custom: activeType === "custom" }}
      onClick={onClick}
    />
  );
};

export default Template;

위의 개선된 코드는 activeType을 이용하여 isClicked 객체를 전달합니다. 또한 onClick 함수에 대한 키 타입 정의를 개선하여 사용자에게 더 명확하고 안정적인 API를 제공합니다.

{...isClicked}
clickedContent={clickedContent}
onClick={handleClickCard}
/>
) : (
<Continue />
)}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

주어진 코드 패치를 간략히 검토해보겠습니다:

  1. useModal이라는 훅을 새로 추가하여 임포트하고 있습니다. 해당 훅의 내용과 사용 방법을 확인해야 합니다.

  2. onClick props가 추가되었습니다. handleClickCard 콜백 함수를 클릭 이벤트 처리에 사용하고, openModal 함수를 호출합니다.

  3. handleClickCardopenModal 함수가 callType 및 해당 조건에 따라 다른 동작을 수행하므로, 해당 동작을 검토해봐야 합니다.

  4. onClick 함수명이 onClick으로 변경되었습니다.

  5. <TemplateButton> 컴포넌트로 전달되는 props에서 isClicked 객체를 전달받게 되었습니다.

  6. 마지막 부분에서 <TemplateButton>의 렌더링 조건과 함께 onClick 콜백도 확인해야 합니다.

</div>
</div>
</>
)}
</>
);
};
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 코드는 비교적 작은 수정으로 구성되어 있습니다. 몇 가지 개선 제안을 드리면 다음과 같습니다:

  1. import 문 정리: 현재 코드에 추가된 컴포넌트를 import하고 있으므로, 필요한 import 문은 모두 주석 처리된 상태입니다. 실제 사용하는 컴포넌트들을 import 해주세요.

  2. jsx 태그 정렬: JSX 요소의 열린 태그와 닫힌 태그를 맞춰주기 위해 각 줄의 들여쓰기를 확인하여 일관된 스타일로 작성하세요.

  3. 클래스 이름 변경: PageContent 컴포넌트의 첫 번째 <div> 요소에 클래스 이름이 추가되었습니다. 이를 수정하여 일관된 규칙을 유지하세요.

  4. Title 컴포넌트 props: Title 컴포넌트의 titlesubTitle Props 값은 상수에서 가져오는 것으로 보입니다. 해당 상수 값을 표시하기 전에 정의된 값인지 확인하고, 변수 또는 문자열 값으로 변경하여 사용하세요.

  5. 번역 문구 확인: subTitle 프롭스에 있는 "명란마요"라는 부분이 번역되어야 할 내용인지 확인하세요.

  6. 인라인 스타일 개선: TimeTableContainer 컴포넌트와 DragnDropContainer를 감싸는 <div> 요소에 인라인 스타일이 사용되었습니다. 가능하다면 CSS 파일로 해당 스타일을 이동시켜 관리하기 쉽도록 변경하세요.

  7. 리팩토링: 중복 코드가 있거나 코드 품질 및 가독성을 개선할 수 있는 부분은 없어 보입니다. 그러나 코드 기반과 프로젝트의 컨벤션을 고려하여 필요한 경우 추가적인 리팩토링을 수행하세요.

위 제안사항을 참고하여 코드를 수정하시면 됩니다.

);
};

export default TimeTableContainer;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰를 해드리겠습니다.

  1. 코드 전체적으로는 깔끔하고 가독성이 좋습니다.
  2. import DateContainer from "./DateContainer";import TimeTable from "./TimeTable";가 필요한 모듈을 임포트하는 것 같습니다. 해당 모듈들이 존재하고 올바르게 동작하는지 확인해야 합니다.
  3. TimeTableContainerProps 인터페이스는 현재 빈 객체로 정의되어 있습니다. 필요한 프롭스(prop)나 프로퍼티(property)를 추가하여 다른 부분과의 상호 작용이 명확하도록 만들 수 있습니다.
  4. min-w-[362px], max-w-[362px] 클래스 속성은 특정 너비를 지정하는 듯합니다. 이에 대해서는 레이아웃 요구사항이나 스타일링 관련 규칙을 확인해야 합니다.
  5. <div className="w-full border border-[#ACBEFF] rounded-[5px] bg-[#FFF9FC]">에서 borderbackground-color 값들이 직접 하드코딩된 것을 볼 수 있습니다. 이런 값들을 프롭스로 받아서 설정할 수 있다면 컴포넌트의 재사용성과 유연성을 높일 수 있습니다.

전반적으로 위 코드는 버그나 크리티컬한 결함을 보이지 않으며, 개선할 사항들은 사소한 부분입니다. 잘 작성된 코드입니다.

Copy link
Member

@pepperdad pepperdad left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다! 코멘트 확인 부탁드릴게요 :)

src/shared/components/ScheduleCard.tsx Outdated Show resolved Hide resolved
Copy link
Member

@pepperdad pepperdad left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 👍

Copy link
Contributor

@NacreousCloud NacreousCloud left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코멘트 확인 부탁드립니다! 바로 수정가능한게 있고, 시간이 걸릴수도있는 사항이 있을것같으니, 코멘트 확인 후 TODO로 남길것은 댓글 남겨주세요! 고생하셨어요!!

src/create-schedule/components/Categories.tsx Outdated Show resolved Hide resolved
src/create-schedule/components/CategoryItems.tsx Outdated Show resolved Hide resolved
src/create-schedule/components/CategoryFrame.tsx Outdated Show resolved Hide resolved
src/create-schedule/components/CategoryFrame.tsx Outdated Show resolved Hide resolved
)
return;

setAppliedItem((prev) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Lv2] 해당함수 중복 로직 개선이 가능할 것같습니다! array return 방식을 통일시켜보는 방식으로 해보시는건 어떨까요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 감이 안오는데 어떤 방식을 말씀하시는지 알려주실 수 있으실까요..?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이런.. 확인이 늦었네요..
selectedItem을 넣는건 조건 여부와 상관없이 동일하기 때문에 해당 조건을 통일시키는 의미였습니다!

setAppliedItem((prev) => {
      if (selectedItem) {
        return [
          ...(prev ? prev : []),
          {
            ...selectedItem,
            startTime: { hour: startHour, minute: startMin },
            endTime: { hour: endHour, minute: endMin },
          },
        ];
      }
      return null;
    });

{ imageSrc: "/images/samples/category_etc.svg", title: "기타" },
];

export const category: CategoryItem[] = [
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Lv2] Const는 대문자로 작성해주세요!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

msw 데이터 부분으로 뺄 예정이라 대충 때려박았습니다..! feat/makeplan 브랜치에서는 msw세팅 완료해서 해당 부분 삭제되어 있습니다!

src/shared/components/ScheduleCard.tsx Show resolved Hide resolved
className="w-full h-full text-[#333333] outline-0"
onChange={({ target: { value } }) => handleInput("category", value)}
>
<option>기타</option>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Lv2] shared/typesCategoryTags에서 전체 만 빼면 되는 option들입니다! 가져와서 사용하시면 될거같아요

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Lv2] useEffect의 의존성인 time이 바뀐다면 해당 컴포넌트 전체가 다시 렌더링되는것과 다를게 없기 때문에, useEffect를 빼고 handleDuration을 setDuration을 하는게 아닌, 결과값만 리턴시켜서 렌더링 시키는게 나아보입니다!

case "customScheduleSelector":
return <CustomScheduleSelector />;
case "templatePreview":
return <TemplatePreview />;
default:
return <></>;
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 리뷰를 도와드리겠습니다.

  1. import 문
  • 현재 코드에는 추가된 모듈(import)이 있는데, 해당 모듈들은 잘 추가되었는지 확인이 필요합니다.
  • CustomScheduleSelector, ScheduleTimeSelector, TemplatePreview 모듈이 임포트되어야 합니다.
  1. switch 문
  • switch 문을 보면 case 별로 다른 컴포넌트를 반환하고 있습니다.
  • 각각의 case에 대해 어떤 동작을 수행하는지 확인이 필요합니다.
  • 반환하는 컴포넌트가 해당 모듈에서 제대로 가져오는지 확인해야 합니다.
  1. ModalContentProps 타입
  • ModalContentProps 타입에 대한 설명이 없어서 해당 타입이 어떤 속성과 값을 가지는지 파악할 수 없습니다.
  • ModalContentProps의 정의를 확인해보고, 사용하는 곳에서 유효한 값들이 전달되는지 확인해야 합니다.

@@ -89,4 +89,7 @@ export type ModalContentId =
| "thumbnailSelector"
| "calendarSelector_start"
| "calendarSelector_end"
| "scheduleTimeSelector"
| "customScheduleSelector"
| "templatePreview"
| "RecruitManage";

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

주어진 코드 패치에 대해 간단하게 코드 리뷰를 도와드리겠습니다. 버그 위험 및 개선 제안을 환영합니다.

이 코드 패치에서는 다음과 같은 변경 사항이 있습니다:

  1. ModalContentId 유형에 새로운 값을 추가했습니다:
    • "scheduleTimeSelector"
    • "customScheduleSelector"
    • "templatePreview"

개선 제안:

  1. 코드에 문제점은 보이지 않습니다. 추가한 모달 컨텐츠 ID들이 적절한 형식으로 선언되어 있는 것 같습니다.
  2. 그러나 코드 리뷰만으로는 프로덕션 환경에서 발생할 수 있는 모든 잠재적인 버그를 확인하기는 어렵습니다. 이 코드 패치를 더 깊이 검토하고 실행 시나리오에서의 테스트를 통해 버그를 찾을 수 있습니다.
  3. 또한, 해당 코드 패치와 상호작용하는 다른 부분도 고려해야 합니다. 다른 파일 내용이나 종속성에 의한 영향을 평가하는 것이 중요합니다.

더 자세한 코드 검토나 개선 사항을 위해서는 코드의 전체 내용을 확인해야 합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants