Showing
2 changed files
with
131 additions
and
81 deletions
| 1 | -.chanel { | 1 | +.channel__list { |
| 2 | + display: flex; | ||
| 3 | + flex-grow: 1; | ||
| 4 | + flex-direction: column; | ||
| 5 | + flex: 0.3; | ||
| 6 | + min-width: 500px; | ||
| 7 | + height: 100vh; | ||
| 8 | + color: white; | ||
| 9 | + background-color: #0e0e0e; | ||
| 10 | + box-sizing: border-box; | ||
| 11 | +} | ||
| 12 | + | ||
| 13 | +.channel__list__title { | ||
| 14 | + display: flex; | ||
| 15 | + padding: 25px; | ||
| 16 | + width: 30vw; | ||
| 17 | + min-width: 500px; | ||
| 18 | + background-color: #0e0e0e; | ||
| 19 | + font-size: 20px; | ||
| 20 | + font-weight: bold; | ||
| 21 | + position: fixed; | ||
| 22 | + box-sizing: border-box; | ||
| 23 | +} | ||
| 24 | + | ||
| 25 | +.channel__list > ul { | ||
| 26 | + list-style: none; | ||
| 27 | + overflow: auto; | ||
| 28 | + padding-top: 50px; | ||
| 29 | +} | ||
| 30 | + | ||
| 31 | +.channel__list > ul > li > hr { | ||
| 32 | + border: 2px solid #282828; | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +.channel { | ||
| 2 | display: flex; | 36 | display: flex; |
| 3 | align-items: center; | 37 | align-items: center; |
| 4 | flex-direction: row; | 38 | flex-direction: row; |
| 5 | - padding-left: 10px; | ||
| 6 | height: 100px; | 39 | height: 100px; |
| 7 | - background-color: #0e0e10; | 40 | + background-color: #0e0e0e; |
| 8 | - padding-left: 10px; | ||
| 9 | } | 41 | } |
| 10 | 42 | ||
| 11 | -.chanel__url { | 43 | +.channel__url { |
| 12 | display: flex; | 44 | display: flex; |
| 13 | align-items: center; | 45 | align-items: center; |
| 14 | flex-grow: 1; | 46 | flex-grow: 1; |
| ... | @@ -20,82 +52,59 @@ | ... | @@ -20,82 +52,59 @@ |
| 20 | padding-bottom: 20px; | 52 | padding-bottom: 20px; |
| 21 | } | 53 | } |
| 22 | 54 | ||
| 23 | -.chanel__box { | 55 | +.channel__box { |
| 24 | display: flex; | 56 | display: flex; |
| 57 | + flex-basis: 80%; | ||
| 25 | flex-direction: row; | 58 | flex-direction: row; |
| 26 | justify-content: space-between; | 59 | justify-content: space-between; |
| 27 | } | 60 | } |
| 28 | 61 | ||
| 29 | -.chanel__box > input { | 62 | +.channel__thumbnail { |
| 30 | - margin-right: 10px; | 63 | + height: 25px; |
| 64 | + width: 25px; | ||
| 65 | + border-radius: 70%; | ||
| 66 | + overflow: hidden; | ||
| 67 | + margin-right: 30px; | ||
| 68 | + background-color: white; | ||
| 69 | +} | ||
| 70 | + | ||
| 71 | +.channel__icon { | ||
| 72 | + height: 25px; | ||
| 73 | + width: 25px; | ||
| 74 | + border-radius: 70%; | ||
| 75 | + overflow: hidden; | ||
| 76 | + margin-right: 30px; | ||
| 31 | } | 77 | } |
| 32 | 78 | ||
| 33 | -.chanel__info { | 79 | +.channel__info { |
| 34 | - width: 5vw; | 80 | + flex-basis: 70%; |
| 35 | margin-right: 20px; | 81 | margin-right: 20px; |
| 36 | } | 82 | } |
| 37 | 83 | ||
| 38 | -.chanel__name { | 84 | +.channel__name { |
| 39 | align-content: center; | 85 | align-content: center; |
| 40 | font-size: 16px; | 86 | font-size: 16px; |
| 41 | } | 87 | } |
| 42 | 88 | ||
| 43 | -.chanel__game { | 89 | +.channel__game { |
| 44 | font-size: 12px; | 90 | font-size: 12px; |
| 45 | color: gray; | 91 | color: gray; |
| 46 | } | 92 | } |
| 47 | 93 | ||
| 48 | -.chanel__view { | 94 | +.channel__view { |
| 49 | - margin-left: 15px; | ||
| 50 | - margin-right: 5px; | ||
| 51 | - width: 4vw; | ||
| 52 | text-align: right; | 95 | text-align: right; |
| 53 | } | 96 | } |
| 54 | 97 | ||
| 55 | -.chanel__thumbnail { | 98 | +.play__icon { |
| 56 | - height: 25px; | 99 | + margin-left: 10px; |
| 57 | - width: 25px; | 100 | + margin-right: 10px; |
| 58 | - border-radius: 70%; | ||
| 59 | - overflow: hidden; | ||
| 60 | - margin-right: 30px; | ||
| 61 | - background-color: white; | ||
| 62 | } | 101 | } |
| 63 | 102 | ||
| 64 | -.chanel__icon { | 103 | +.pause__icon { |
| 65 | - height: 25px; | 104 | + margin-left: 10px; |
| 66 | - width: 25px; | 105 | + margin-right: 10px; |
| 67 | - border-radius: 70%; | ||
| 68 | - overflow: hidden; | ||
| 69 | - margin-right: 30px; | ||
| 70 | } | 106 | } |
| 71 | 107 | ||
| 72 | 108 | ||
| 73 | -.chanel__list { | ||
| 74 | - display: flex; | ||
| 75 | - flex-grow: 1; | ||
| 76 | - flex-direction: column; | ||
| 77 | - flex: 0.2; | ||
| 78 | - padding-right: 10px; | ||
| 79 | - min-width: 300px; | ||
| 80 | - height: 100vh; | ||
| 81 | - color: white; | ||
| 82 | - background-color: #0e0e10; | ||
| 83 | -} | ||
| 84 | 109 | ||
| 85 | -.chanel__list > ul { | ||
| 86 | - list-style: none; | ||
| 87 | - overflow: auto; | ||
| 88 | - padding-top: 50px; | ||
| 89 | -} | ||
| 90 | - | ||
| 91 | -.chanel__list > ul > li > hr { | ||
| 92 | - border: 2px solid #282828; | ||
| 93 | -} | ||
| 94 | 110 | ||
| 95 | -.chanel__list > strong { | ||
| 96 | - padding: 25px; | ||
| 97 | - width: 17%; | ||
| 98 | - background-color: #0e0e0e; | ||
| 99 | - font-size: 20px; | ||
| 100 | - position: fixed; | ||
| 101 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| 1 | import React from "react"; | 1 | import React from "react"; |
| 2 | -import "./Chanel.css"; | 2 | +import "./Channel.css"; |
| 3 | import "@material-ui/icons" | 3 | import "@material-ui/icons" |
| 4 | import PersonIcon from "@material-ui/icons/Person"; | 4 | import PersonIcon from "@material-ui/icons/Person"; |
| 5 | import PlayArrowIcon from '@material-ui/icons/PlayArrow'; | 5 | import PlayArrowIcon from '@material-ui/icons/PlayArrow'; |
| 6 | -import StopIcon from '@material-ui/icons/Stop'; | ||
| 7 | import PauseIcon from '@material-ui/icons/Pause'; | 6 | import PauseIcon from '@material-ui/icons/Pause'; |
| 7 | +import { WatchOutlined } from "@material-ui/icons"; | ||
| 8 | 8 | ||
| 9 | -export function Chanel(props) { | 9 | +export function Channel(props) { |
| 10 | - const chanel = props.chanel; | 10 | + const channel = props.channel; |
| 11 | 11 | ||
| 12 | return ( | 12 | return ( |
| 13 | - <div className="chanel"> | 13 | + <div className="channel"> |
| 14 | - <a href={chanel.url} className="chanel__url"> | 14 | + <a href={channel.url} className="channel__url"> |
| 15 | - {chanel.thumbnail && <img className="chanel__thumbnail" src={chanel.thumbnail} alt=""></img>} | 15 | + {channel.thumbnail && <img className="channel__thumbnail" src={channel.thumbnail} alt=""></img>} |
| 16 | - {!chanel.thumbnail && <PersonIcon className="chanel__icon"/>} | 16 | + {!channel.thumbnail && <PersonIcon className="channel__icon"/>} |
| 17 | - <div className="chanel__box"> | 17 | + <div className="channel__box"> |
| 18 | - <div className="chanel__info"> | 18 | + <div className="channel__info"> |
| 19 | - <div className="chanel__name">{chanel.name}</div> | 19 | + <div className="channel__name">{channel.name}</div> |
| 20 | - <div className="chanel__game">{chanel.game}</div> | 20 | + <div className="channel__game">{channel.game}</div> |
| 21 | </div> | 21 | </div> |
| 22 | - <div className="chanel__view">{chanel.view}</div> | 22 | + <div className="channel__view">{channel.view}</div> |
| 23 | - <input type="radio" name="chanel"></input> | ||
| 24 | </div> | 23 | </div> |
| 25 | - | ||
| 26 | </a> | 24 | </a> |
| 25 | + {channel.isPlay && <PauseIcon className="pause__icon" onClick={props.onClick} />} | ||
| 26 | + {!channel.isPlay && <PlayArrowIcon className="play__icon" onClick={props.onClick} />} | ||
| 27 | </div> | 27 | </div> |
| 28 | ); | 28 | ); |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | -export class ChanelList extends React.Component { | 31 | +export class ChannelList extends React.Component { |
| 32 | - | 32 | + constructor(props) { |
| 33 | - | 33 | + super(props); |
| 34 | - render() { | 34 | + |
| 35 | // data for test | 35 | // data for test |
| 36 | const test = [ | 36 | const test = [ |
| 37 | {"name": "name1", "view": 999, "game": "game1" ,"url": "https://www.twitch.tv", "thumbnail": "https://upload.wikimedia.org/wikipedia/commons/2/26/Twitch_logo.svg"}, | 37 | {"name": "name1", "view": 999, "game": "game1" ,"url": "https://www.twitch.tv", "thumbnail": "https://upload.wikimedia.org/wikipedia/commons/2/26/Twitch_logo.svg"}, |
| ... | @@ -46,20 +46,61 @@ export class ChanelList extends React.Component { | ... | @@ -46,20 +46,61 @@ export class ChanelList extends React.Component { |
| 46 | {"name": "name2", "view": 123124124, "game": "game2" , "url": "https://www.twitch.tv"}, | 46 | {"name": "name2", "view": 123124124, "game": "game2" , "url": "https://www.twitch.tv"}, |
| 47 | ] | 47 | ] |
| 48 | 48 | ||
| 49 | - const chanels = test; | 49 | + this.state = { |
| 50 | + channels: test, | ||
| 51 | + xisPlaying: null, | ||
| 52 | + } | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + changeState(channel, index){ | ||
| 56 | + const channels = this.state.channels; | ||
| 57 | + // 버튼을 누른 채널이 재생중일때 | ||
| 58 | + if (channel.isPlay === true) { | ||
| 59 | + channels[index].isPlay = false; | ||
| 60 | + this.setState({ | ||
| 61 | + channels: channels, | ||
| 62 | + xisPlaying: null, | ||
| 63 | + }); | ||
| 64 | + } | ||
| 50 | 65 | ||
| 66 | + // 버튼을 누른 채널이 재생중이 아닐 때 | ||
| 67 | + else { | ||
| 68 | + // xisPlaying이 null이 아닐 때 | ||
| 69 | + if (this.state.xisPlaying !== null) { | ||
| 70 | + // 기존에 재생되던 채널의 isPlay를 false로, 클릭 이벤트가 발생한 채널의 isPlay를 true로 변경 | ||
| 71 | + channels[this.state.xisPlaying].isPlay = false; | ||
| 72 | + channels[index].isPlay = true; | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + // xisPlaying이 null일 때 | ||
| 76 | + else { | ||
| 77 | + channels[index].isPlay = true; | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + this.setState({ | ||
| 81 | + channels: channels, | ||
| 82 | + xisPlaying: index, | ||
| 83 | + }); | ||
| 84 | + } | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + render() { | ||
| 51 | return ( | 88 | return ( |
| 52 | - <div className="chanel__list"> | 89 | + <div className="channel__list"> |
| 53 | - <strong>CHANELS</strong> | 90 | + <div className="channel__list__title"> CHANNEL LIST</div> |
| 54 | <ul> | 91 | <ul> |
| 55 | - {chanels.map((chanel) => ( | 92 | + {this.state.channels.map((channel, index) => ( |
| 56 | - <li> | 93 | + <li key={index}> |
| 57 | - <Chanel chanel={chanel}/> | 94 | + <Channel |
| 95 | + channel={channel} | ||
| 96 | + onClick={ () => this.changeState(channel, index)} | ||
| 97 | + /> | ||
| 58 | <hr /> | 98 | <hr /> |
| 59 | </li> | 99 | </li> |
| 60 | ))} | 100 | ))} |
| 61 | </ul> | 101 | </ul> |
| 62 | </div> | 102 | </div> |
| 103 | + | ||
| 63 | ); | 104 | ); |
| 64 | } | 105 | } |
| 65 | } | 106 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment