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

[나지원] sprint10 #128

Conversation

najitwo
Copy link
Collaborator

@najitwo najitwo commented Nov 2, 2024

요구사항

기본

상품 등록 페이지

  • 상품 등록 페이지 주소는 "/addboard" 입니다.
  • 게시판 이미지는 최대 한개 업로드가 가능합니다.
  • 각 input의 placeholder 값을 정확히 입력해주세요.
  • 이미지를 제외하고 input 에 모든 값을 입력하면 '등록' 버튼이 활성화 됩니다.

상품 상세 페이지

  • 상품 상세 페이지 주소는 "/board/{id}" 입니다.
  • 댓글 input 값을 입력하면 '등록' 버튼이 활성화 됩니다.
  • 활성화된 '등록' 버튼을 누르면 댓글이 등록됩니다

심화

  • 회원가입, 로그인 api를 사용하여 받은accessToken을 사용하여 게시물 등록을 합니다.
  • '등록' 버튼을 누르면 게시물 상세 페이지로 이동합니다.

스크린샷

배포 페이지: https://najimarket.vercel.app/boards

상품 등록 페이지

najimarket vercel app_addboard

상품 상세 페이지

najimarket vercel app_addboard (1)

멘토에게

  • 로그인 페이지는 추가를 못해서 로그인 로직이 하드 코딩 되어있습니다.

@najitwo najitwo added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Nov 2, 2024
Copy link
Collaborator

@GANGYIKIM GANGYIKIM left a comment

Choose a reason for hiding this comment

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

지원님 이번 스프린트 미션 고생하셨습니다.

components/ui/Dropdown.tsx Show resolved Hide resolved
components/board/AddCommentForm.tsx Show resolved Hide resolved
Comment on lines +17 to +22
if (e.target.value !== "") {
setIsDisabled(false);
return;
}

setIsDisabled(true);
Copy link
Collaborator

Choose a reason for hiding this comment

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

P3:
아래코드도 동일동작합니다.

Suggested change
if (e.target.value !== "") {
setIsDisabled(false);
return;
}
setIsDisabled(true);
const isEmpty = !e.target.value.trim();
setIsDisabled(isEmpty);

Comment on lines +40 to +53
<button
type="button"
className={styles.cancelButton}
onClick={onCancel}
>
취소
</button>
<Button
className={styles.editButton}
type="submit"
disabled={isDisabled}
>
수정완료
</Button>
Copy link
Collaborator

Choose a reason for hiding this comment

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

P3:
취소랑 수정완료랑 왜 다르게 작업하셨을까요? 취소 버튼은 ui에 정의하신 버튼 컴포넌트로 커버가 안될까요? 🧐

components/boards/BestBoard.tsx Show resolved Hide resolved
}

const AuthorInfo = ({ className, nickname, image, date }: Props) => {
const AuthorInfo = ({ nickname, date, className, image }: Props) => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

P3:

Suggested change
const AuthorInfo = ({ nickname, date, className, image }: Props) => {
const AuthorInfo = ({ nickname, date, className ='' , image }: Props) => {

Comment on lines +25 to +26
const allowedTypes = ["image/png", "image/jpeg"];
if (!allowedTypes.includes(nextValue.type)) return;
Copy link
Collaborator

Choose a reason for hiding this comment

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

P3:
👍

Copy link
Collaborator

Choose a reason for hiding this comment

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

사용자 피드백까지 주면 더 좋을 것 같아요~

Comment on lines +10 to +16
const HeartButton = ({ favoriteCount, className }: HeartButtonProps) => {
return (
<button
type="button"
aria-label="좋아요 버튼"
className={`${styles.heartButton} ${className}`}
>
Copy link
Collaborator

Choose a reason for hiding this comment

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

P3:
아직 필요하지 않으셔서 추가하지 않은 것 같지만 버튼이니 나중에 onClick 함수를 넘길 수 있게 추가해주세요~

Comment on lines +18 to +28
const Input = ({
type = "text",
name = "",
className = "",
label = "",
placeholder = "",
value = "",
onChange = () => {},
onKeyUp = () => {},
children,
}: InputProps) => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

P2:
많은 속성들이 초기화가 필요 없을 것 같아요. name속성도 없을 때 빈 문자열로 초기화해주지 않는것이 더 좋을 것 같고, value도 동일할 것 같습니다~ 한번 확인해보세요

Copy link
Collaborator

Choose a reason for hiding this comment

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

그리고 placeholder, value, onKeyup, onChange같이 한번만 사용되는 props들은 나열하지 않고 스프레드 연산자로 받으셔서 전달하셔도 될 것 같습니다.

const Input = ({
  name,
  className = "",
  label = "",
  type = "text",
  children,
  ...inputProps
}: InputProps) => {
return (
    <Container className={`${styles.container} ${className}`}>
      <Label className={styles.label} htmlFor={name}>
        {label}
      </Label>
      <div className={styles.inputContainer}>
        <input
          className={styles.input}
          type={type}
          name={name}
          id={name}
          {...inputProps}
        />
        {children}
      </div>
    </Container>
  );
}

}, [refreshAccessToken]);

return (
<AuthContext.Provider value={{ accessToken, login, logout }}>
Copy link
Collaborator

Choose a reason for hiding this comment

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

P2:
멘토링때 말씀드린것처럼 context 사용시 전달되는 value는 자식들의 잦은 리렌더링을 막기위해 useMemo를 감싸 전달합니다.
관련해서 읽으실만한 글 링크드립니다~

https://velog.io/@velopert/react-context-tutorial

@GANGYIKIM GANGYIKIM merged commit f8b22be into codeit-bootcamp-frontend:Next-나지원 Nov 5, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants