-
Notifications
You must be signed in to change notification settings - Fork 44
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
[박성재] Week7 #347
The head ref may contain hidden characters: "part2-\uBC15\uC131\uC7AC-week7"
[박성재] Week7 #347
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
조금 늦더라도 제출을 하는 게 중요하죠!!!
수고 많으셨고, 8주차도 늦더라도 꼭 제출해주세요 👍
export const TWITTER_URL = "https://www.twitter.com/"; | ||
export const INSTAGRAM_URL = "https://www.instagram.com/"; | ||
|
||
export const getUser = async () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아래 getFolderUser 와 fetchURL 을 제외하고는 똑같아서 공통화해보시면 좋을 거 같아요!
export getUser = async(url) => {
... fetch(url)
.. }
요런 식으로요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
src 안에 바로 있는데 pages 같은 폴더로 한 번 묶어주면 좋을 거 같아요!
const displayCreatedAt = (createdAt) => { | ||
const date = new Date(createdAt); | ||
const now = Date.now(); | ||
const milliSeconds = now - date; | ||
|
||
const seconds = milliSeconds / 1000; | ||
const minutes = seconds / 60; | ||
const hours = minutes / 60; | ||
const days = hours / 24; | ||
const months = days / 30; | ||
const years = months / 12; | ||
|
||
if (seconds < 60) { | ||
return "방금 전"; | ||
} else if (minutes < 60) { | ||
return `${Math.floor(minutes)}분 전`; | ||
} else if (hours < 24) { | ||
return `${Math.floor(hours)}시간 전`; | ||
} else if (days < 30) { | ||
return `${Math.floor(days)}일 전`; | ||
} else if (months < 12) { | ||
return `${Math.floor(months)}달 전`; | ||
} else { | ||
return `${Math.floor(years)}년 전`; | ||
} | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분은 함수와 상관없이, 그냥 숫자계산만 해주는 부분이라 util 폴더로 빼주면 좋을 거 같아요!
utils > displayCreatedAt.ts
|
||
const Card = ({ data }) => { | ||
const { createdAt, description, imageSource, url } = data; | ||
if (!data) return; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
jsx 를 파일 최하단에서도 return 하고, 여기서도 return 하면 헷갈릴 수 있으니,
아래 return 부를 return ({data && <.... /> })
로 묶어주면 좋을 거 같습니다!
const { createdAt, description, imageSource, url } = data; | ||
if (!data) return; | ||
|
||
let time = displayCreatedAt(createdAt); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
변하지 않는 값이라 const 추천드려요!
let time = displayCreatedAt(createdAt); | |
const time = displayCreatedAt(createdAt); |
<div className='description'> | ||
<span>{time}</span> | ||
<p>{description}</p> | ||
<span>{new Date(createdAt).toLocaleDateString()}</span> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
렌더부에서 연산을 해주면 계속 재연산되어서 좋지 않아요!
위에서 변수로 선언해주고, 렌더부에서는 갖다 쓰시기만 하는 걸 추천드립니다
<span>{new Date(createdAt).toLocaleDateString()}</span> | |
// 위쪽 | |
const displayDate = new Date(createdAt).toLocaleDateString() | |
// 아래 렌더부 | |
<span>{displayDate}</span> |
{linkDatas.map((data) => { | ||
return <Card key={data.id} data={data} />; | ||
})} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
한 줄로 리턴할 때는 return 을 안써주는 게 더 가독성이 좋아요! 특히 렌더부에서요!
{linkDatas.map((data) => { | |
return <Card key={data.id} data={data} />; | |
})} | |
{linkDatas.map((data) => <Card key={data.id} data={data} />)} |
const Footer = () => { | ||
return ( | ||
<div className='Footer'> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
className 규칙 통일해주세요!
const Footer = () => { | |
return ( | |
<div className='Footer'> | |
const Footer = () => { | |
return ( | |
<div className='footer'> |
import "./Header.css"; | ||
|
||
const Header = ({ user }) => { | ||
let { email, profileImageSource } = user; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
let { email, profileImageSource } = user; | |
const { email, profileImageSource } = user; |
if (!folderUser || !folderUser.folder) { | ||
return null; | ||
} | ||
const { name } = folderUser.folder; | ||
if (!folderUser.folder.owner) { | ||
return null; | ||
} | ||
const { name: ownerName, profileImageSource } = folderUser.folder.owner; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
위에 말씀드렸듯 중간에 return 을 하는 것보다는 아래처럼 해보면 어떨까합니다!
if (!folderUser || !folderUser.folder) { | |
return null; | |
} | |
const { name } = folderUser.folder; | |
if (!folderUser.folder.owner) { | |
return null; | |
} | |
const { name: ownerName, profileImageSource } = folderUser.folder.owner; | |
const { name, owner } = folderUser.folder | |
const { name: ownerName, profileImageSource } = owner | |
const isUserInfoExist = name && ownerName && profileImageSource | |
return ( | |
isUserInfoExist && { | |
<div className="Info"> | |
<img src={profileImageSource} alt="profileImageSource" /> | |
<p>@{ownerName}</p> | |
<h1>{name}</h1> | |
</div> | |
} | |
) | |
요구사항
기본
[기본] 상단 네비게이션 바, 푸터가 랜딩 페이지와 동일한 스타일과 규칙으로 만들어졌나요? (week 1 ~ 3 요구사항 참고)
[기본] 상단 네비게이션 바에 프로필 영역의 데이터는 https://bootcamp-api.codeit.kr/docs 에 명세된 “/api/sample/user”를 활용했나요?
[기본] 상단 네비게이션 바에 프로필 영역의 데이터가 없는 경우 “로그인” 버튼이 보이도록 만들었나요?
[기본] 폴더 소유자, 폴더 이름 영역, 링크들에 대한 데이터는 “/api/sample/folder”를 활용했나요?
[기본] Static, no image, Hover 상태 디자인을 보여주는 카드 컴포넌트를 만들었나요?
[기본] Hover 상태에서 이미지가 기본 크기의 130%로 커지나요?
[기본] 카드 컴포넌트를 클릭하면 해당 링크로 새로운 창을 띄워서 이동하나요?
[기본] Tablet에서 카드 리스트가 화면의 너비 1124px를 기준으로 이상일 때는 3열로 작을 때는 2열로 배치되나요?
[기본] Tablet, Mobile에서 좌우 최소 여백은 32px 인가요?
심화
주요 변경사항
스크린샷
멘토에게