Wecode 8๊ธฐ๋ฅผ ์์ํ์ง 6์ฃผ์ฐจ์ 1์ฐจ ํ๋ก์ ํธ๋ฅผ 2์ฃผ๊ฐ ์งํํ์๋ค.
ํ๋ก์ ํธ ํ์ 4๋ช
์ ๊ฐ๋ฐ์ Front-End 3๋ช
, Back-End 1๋ช
์ผ๋ก ๊ตฌ์ฑํ์ฌ ํ์
ํ์๋ค.
๋ก๊ทธ์ธ, ํ์๊ฐ์
, ์ ํ์ ์์ธ ํ์ด์ง, ๊ทธ๋ฆฌ๊ณ Supportํ์ด์ง
์ฐ์ , Beats(https://www.beatsbydre.com)์๋ ๋ก๊ทธ์ธ, ํ์๊ฐ์
ํ์ด์ง๊ฐ ์์๋ค. ๊ทธ๋์ ๋ค๋ฅธ ์น ์ฌ์ดํธ์ ๋ก๊ทธ์ธ ํ์๊ฐ์
๋ฅผ ์ฐจ์ฉํด Beats ํํ์ด์ง์ ์ด์ธ๋ฆฌ๊ฒ ๋ค์ ๋์์ธ์ ํ์๋ค.
๋ก๊ทธ์ธ, ํ์๊ฐ์
์ Modal
๋ก ๊ตฌ์ฑํ์๋ค.
์ค์ Beats ํํ์ด์ง ๋ฉ์ธ ํ๋ฉด์ ๋ณด๋ฉด ์ด๋ ๊ฒ ๊ตฌ์ฑ๋์ด์๋ค.
์ค๋ฅธ์ชฝ ์๋จ์ ๋ก๊ทธ์ธ ๋ฒํผ์ ๋ฃ์ ์ฐ๋ฆฌ ํ๋ก์ ํธ ๋ฉ์ธํ๋ฉด ๋ถ๋ถ์ด๋ค.
์ฌ๊ธฐ์ ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด Modal๋ก ๋ง๋ค์ด์ง Login ํ๋ฉด์ด ๋์จ๋ค.
"@" ๋ฅผ ํฌํจํ Email์ฃผ์์ 8์ ์ด์์ Password๋ฅผ ์
๋ ฅํ๋ฉด ๋ฒํผ์ด ํ์ฑํ๊ฐ ๋๋ค.
ํ์๊ฐ์
์ ํ๋ ค๋ฉด Login ๋ฒํผ ์๋ Sign Up ๋ฒํผ์ ๋๋ฅด๋ฉด๋๋ค.
SignUp ์ฐฝ ๋ํ ๋ฒํผ์ด ํ์ฑํ๊ฐ ๋๋ค. ์ฐ์ , ๋ชจ๋ ์
๋ ฅ์ฐฝ์ด ์ฑ์์ ธํ๊ณ , Email๊ณผ Password๋ ์ ๊ท์์ ์ฌ์ฉํด์ Email์ @
์ .
์ด ๋ฐ๋์ ๋ค์ด๊ฐ์ผ ํ๊ณ , password๋ 8~20์์ฌ์ด ์๋ฌธ๊ณผ ์ซ์๋ก ๊ตฌ์ฑ๋์ด์ผ ํ๋ค.
ํ์๊ฐ์ ์ด ์๋ฃ๊ฐ ๋๋ฉด ๋ฉ์ธํ๋ฉด์ Login ๋ฒํผ์ SignUp ๋ ์ ๋ ฅํ๋ username์ผ๋ก ๋ฐ๋๋ค.
๋๋ฒ์งธ๋ก ๋งก์ ๋ถ๋ถ์ Support ํ์ด์ง ์ด๋ค. ํ์ด์ง์ ์์ธํ ๊ตฌ์ฑ์ ์์ ์ ํฌ๋ธ ๋งํฌ๋ก ๋ค์ด๊ฐ์ ๋ณผ ์ ์๋ค. (0:41)
์ธ๋ฒ์งธ๋ก ๋งก์ ๋ถ๋ถ์ ์ ํ์ ์์ธ ํ์ด์ง์ด๋ค. Beats์ ์ ํ ์ค Pill ์คํผ์ปค์ ์์ธ ํ์ด์ง๋ฅผ ๋ด๋นํ์๋ค. ์ด ๋ํ ํ์ด์ง์ ์์ธํ ๊ตฌ์ฑ์ ์ ํฌ๋ธ ๋งํฌ๋ก ๋ค์ด๊ฐ์ ๋ณผ ์ ์๋ค. (1:35)
Modal
๋ก effect ๊น์ง ์ถ๊ฐํ์ฌ ๊ตฌํํ์๋ค. Modal
๋ก ์์
ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํด๋น ๊ธฐ๋ฅ์ ๊ณต๋ถํ๊ณ , ์ตํ๋๋ฐ ์๊ฐ์ด ๋ง์ด ์์๋์๋ค. ๊ฒฐ๊ตญ Modal
๋ก ๋ก๊ทธ์ธ ํ์๊ฐ์
ํ์ด์ง UI์ก๊ณ ๋ก์ง์ง๋๋ฐ 4์ผ์ด ๊ฑธ๋ ธ๋ค..(์ด๊ฒ๋ ๊ฒฐ๊ตญ ๋์ค์ ๋ ์์ ์ ํ์ง๋ง..) ์ด ๋ถ๋ถ์ด ๋๋ฌด ์์ฝ๋ค. ํ์
ํ๋ก์ ํธ๊ฐ ์ฒ์์ด๋ผ ์ด๋ ค์ด ๋ฌธ์ ์ ์ง๋ฉดํ์๋ ๋ฉํ์ด ๋๊ฐ์ ํผ์ ๋๋ ์์๋๋ฐ, ํ์๋ค์๊ฒ ๋์์ ์ฒญํ๊ณ , ๋ฉํ ๋์๊ฒ ์๋ด์ ๋ฐ์ ํ ๋ค์ ๋ฉํ์ ์ก๊ณ ์์ฑ์ํฌ์ ์์๋ค. ์ด๋ ํฌ๊ฒ ๋ฐฐ์ด ์ ์ ํ์๋ค๊ณผ ํ์
์ ํ๋ฉด์ ์ด๋ค์ง๋ ์ปค๋ฎค๋์ผ์ด์
์ ๋จ์ํ ๊ธฐ๋ฅ์ ์ธ ๋ถ๋ถ๋ง ํ๋๊ฒ ์๋๋ผ ์ ์ด๋ค. ๋ถ์กฑํ ๋๋ฅผ ๋ง์ด ๋ฐฐ๋ คํด์ฃผ๊ณ , ์๋ก์๊ฒ ํญ์ ์ข์ ๋ง์ ๋ง์ด ํด์ค ํ์๋ค์๊ฒ ๊ฐ์ฌํ ๋ฟ์ด๋ค.FetchRegister = () => {
fetch(`${API}/register`, {
method: "POST",
body: JSON.stringify({
email: this.state.email,
password: this.state.password,
first_name: this.state.first_name,
last_name: this.state.last_name,
}),
}).then((res) => {
if (res.ok) {
localStorage.setItem("Authorization", res.Authorization);
alert("WELCOME TO THE BEATS");
this.props.switch();
}
});
};
handleClickEvent = () => {
const { email, password, password_re, first_name, last_name } = this.state;
if (
email &&
password &&
password_re &&
password === password_re &&
first_name &&
last_name
) {
this.FetchRegister();
}
};
const SpeakerImg = {
0: {
src: `${Config.ProductsPillColor}/white_thqrt_retina_1800x1800_V2.png`,
},
1: {
src: `${Config.ProductsPillColor}/black_thqrt_retina_1800x1800_V2.png`,
},
2: {
src: `${Config.ProductsPillColor}/_0001_rgb_ML4Q2-RGB-thrqtrlft_V2.png`,
},
};
class ProductsDetailPage2 extends React.Component {
state = {
isActive: 0,
view: 0,
};
ImgSelect = (number) => {
this.setState({ view: number });
};
......
<div className="ColorList">
<div className="WhiteWrap">
<div className="White">
<div
className="WhiteBox"
onClick={() => this.ImgSelect(0)}
/>
</div>
<div className="TextWhite">White</div>
</div>
<div className="BlackWrap">
<div className="Black">
<div
className="BlackBox"
onClick={() => this.ImgSelect(1)}
/>
</div>
<div className="TextBlack">Black</div>
</div>
<div className="RedWrap">
<div className="Red">
<div
className="RedBox"
onClick={() => this.ImgSelect(2)}
/>
</div>
<div className="TextRed">Red</div>
</div>
</div>
์์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํด๋น ์ฌ์ง์ด ๋ํ๋๋ ์ฝ๋ฉ์ด๋ค. state๊ฐ view๋ฅผ 0์ผ๋ก ์ฃผ๊ณ , ์ด๊ฒ default๊ฐ 0(white)์ด ๋๋ค. 1(black), 2(red)๊ฐ ๋๋๊ฒ์ด๋ค. ์ด๋ํ ์ค๋ณต๋๋ ์ฃผ์๋ฅผ Config์ ๋ณ์ํ์ํค๊ณ , endpoint๋ ์ง์ ์์ฑํด์ค๊ฒ์ ๋ณผ์ ์๋ค.
ํ๋ก์ ํธ๋ฅผ ๋ง๋ฌด๋ฆฌํ๊ณ ์ ๋ฐ์ ์ผ๋ก ๋๋์ ์ ๋ณ๊ฑฐ ์๋๋ผ๊ณ ์๊ฐํ๋๊ฒ ์ฌ์ค ๊ฐ์ฅ ์ค์ํ๋ค๋ ๊ฒ์ด๋ค. ์ฝ๋ฉ์ ํ๊ณ , ๊ธฐ๋ฅ ๊ตฌํํ๋๊ฒ ๋ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค. ํ์ง๋ง ํ๋ก์ ํธ ์ด๋ฐ๋ถํฐ ๋ฉํ์ด ๋๊ฐ์ ๋๋ก ํ๋ ์ํ์ ์ง๋ฉดํ๊ณ , ๋ ์ด์ ์ด๋ป๊ฒ ์ฝ๋ฉ์ ์ง์ผํ ์ง ๋ง๋งํ ์ํ์์ ๋ฌด์์ ํด์ผํ ์ง ๋ชฐ๋์๋ ํด๊ฒฐํด์ค๊ฑด ์ปค๋ฎค๋์ผ์ด์
์ด์๋ค. ๊ฐ์ ํ์๋ค์๊ฒ ๋์์ ์์ฒญํ๊ณ , ๋ฉํ ๋๊ณผ ๋ํ๋ฅผ ๋๋์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฑฐ์ง๋ง์ฒ๋ผ ํด๊ฒฐ๋์๋ค. ํ๋ก์ ํธ ์์ํ ๋ ์ปค๋ฎค๋์ผ์ด์
์ด ์ ์ค์ํ๋ค๊ณ ํ๋์ง ์ ๋๋ก ๋๊ผ๋ค. ํผ์ ๋๋ ์๋๋ค๊ณ ํด๊ฒฐ๋๋๊ฑด ์๋ค..
๊ทธ๋ฆฌ๊ณ .. ์ ์ ํ ์คํธ๋ ์ค๋ ๋๋ฅผ ์ฑ์ฅ์ํจ๋ค... ์ ์ ํ์ง ์์ ์คํธ๋ ์ค ์์ง๋ง..