Advertisement
Guest User

Untitled

a guest
Feb 20th, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <html>
  2.  
  3. <head>
  4.     <title>Hockey! exercise 10.1</title>
  5. </head>
  6.  
  7. <body>
  8.  
  9.     <div id="root"></div>
  10.  
  11.     <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
  12.     <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
  13.     <script src="https://unpkg.com/redux@latest/dist/redux.min.js"></script>
  14.     <script src="https://unpkg.com/react-redux@latest/dist/react-redux.js"></script>
  15.     <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.21.1/babel.min.js"></script>
  16.     <script type="text/babel">
  17.  
  18.         const { createStore, combineReducers } = Redux;
  19.     const {connect, Provider} = ReactRedux;
  20.     const {useState} = React
  21.  
  22.     const ADD_PLAYER = 'ADD_PLAYER'
  23.     const DELETE_PLAYER = 'DELETE_PLAYER'
  24.     const CHANGE_PLAYER_ACTIVE = 'CHANGE_PLAYER_ACTIVE'
  25.     const SET_ACTIVE_PLAYER = 'SET_ACTIVE_PLAYER'
  26.  
  27.  
  28.     const addPlayer = (player) => {
  29.         return {type:ADD_PLAYER, player:player }
  30.     }
  31.     const deletePlayer = (id) => {
  32.         return {type:DELETE_PLAYER, id:id }
  33.     }
  34.     const changePlayerActivity = (player) => {
  35.         return {type:CHANGE_PLAYER_ACTIVE, player:player }
  36.     }
  37.     const changeActivePlayer = (player) => {
  38.         return {type:SET_ACTIVE_PLAYER, selected:player}
  39.     }
  40.  
  41.     const initialState = {
  42.         players : [],
  43.         count: 0
  44.     }
  45.    
  46.     const playerReducer = (state = initialState, action) => {
  47.         switch(action.type){
  48.             case ADD_PLAYER:
  49.                 console.log("adding")
  50.                 return Object.assign({}, state, {
  51.                 ...state,
  52.                 count: state.count +1,
  53.                 players: [
  54.                 ...state.players,
  55.                 action.player
  56.                 ]
  57.             })
  58.         case DELETE_PLAYER:
  59.             console.log("deleting", action.id)
  60.             return Object.assign({}, state, {
  61.                 players: state.players.filter(i => i.id !== action.id)
  62.             })
  63.        
  64.         case CHANGE_PLAYER_ACTIVE:
  65.             console.log("changing")
  66.             return Object.assign({}, state, {
  67.             players: state.players.map(i => i.id === action.player.id ? action.player:i)
  68.             })
  69.         default:
  70.             return state
  71.         }
  72.     }
  73.    
  74.     const activePlayer = (state={selected:{}}, action)=>{
  75.         switch(action.type){
  76.             case SET_ACTIVE_PLAYER:
  77.                 console.log("setting")
  78.                 return Object.assign({}, state, {
  79.                 ...state,
  80.                 selected: action.selected
  81.                 })
  82.             case CHANGE_PLAYER_ACTIVE:
  83.                 console.log("setting")
  84.                 return Object.assign({}, state, {
  85.                 ...state,
  86.                 selected: action.player
  87.                 })
  88.             case DELETE_PLAYER:
  89.                 console.log("deleting", action.id)
  90.                 return Object.assign({}, state, {
  91.                     selected: {}
  92.             })
  93.             default:
  94.                 return state
  95.         }
  96.     }
  97.    
  98.     const playerApp = combineReducers({
  99.         playerReducer,
  100.         activePlayer
  101.     })
  102.    
  103.     const store = createStore(playerApp, window.__REDUX_DEVTOOLS_EXTENSION__ &&
  104.      window.__REDUX_DEVTOOLS_EXTENSION__());
  105.    
  106.     const unsubscribe = store.subscribe(()=>{
  107.         console.log("store = ",store.getState())
  108.     })
  109.  
  110.     const Player = ({player, changeActivePlayer}) => {
  111.         const {name, id} = player
  112.         return (
  113.             <div style={{margin:"5px"}}>
  114.                 <button onClick={() => changeActivePlayer(player)}>{name}</button>
  115.             </div>
  116.         )
  117.     }
  118.    
  119.     const Players = ({players, changeActivePlayer}) => {
  120.         const playersArray = players.map(i => <Player key={i.id} changeActivePlayer={changeActivePlayer} player={i} />)
  121.         return (
  122.             <div>
  123.                 {playersArray}
  124.             </div>
  125.         )
  126.     }
  127.  
  128.     const ActivePlayer = ({player, changePlayerActivity, deletePlayer}) => {
  129.  
  130.         const styles = {
  131.             marginTop: "10px"
  132.         }
  133.  
  134.         if (player == undefined || Object.entries(player).length === 0)
  135.             return <div style={styles}>No player selected</div>
  136.         let activeBtn
  137.         if (player.active)
  138.             activeBtn = <button style={{marginLeft:"10px"}} onClick={() => changePlayerActivity({...player, active:false})}>Deactivate</button>
  139.            
  140.         return (
  141.             <div style={styles}>
  142.                 <p >Name:  {player.name} Active: {""+player.active}
  143.                     {activeBtn}
  144.                     <button onClick={() => deletePlayer(player.id)}>Delete</button> </p>
  145.             </div>
  146.         )
  147.     }
  148.  
  149.     const Form = ({addPlayer, id}) => {
  150.  
  151.         const [name, setName] = useState("")
  152.         const [active, setActive ] = useState(false)
  153.        
  154.         const styles = {
  155.             marginTop: "15px"
  156.         }
  157.  
  158.         return (
  159.             <div style={styles}>
  160.                 <form id="addPlayerForm">
  161.                     Name: <input onChange={e => setName(e.target.value)} id="name-input" type="text" name="name" />
  162.                     <br/> Active: <input onChange={e => setActive(e.target.checked)} id="active-input" type="checkbox" name="active" />
  163.                     <button id="add" type="button" value="Add" onClick={() => addPlayer({id, name, active})}>Add a player</button>
  164.                 </form>
  165.             </div>
  166.         )
  167.     }
  168.  
  169.     const Container = ({nextId, players, addPlayer, activePlayer, deletePlayer, changePlayerActivity, changeActivePlayer}) => {
  170.         return (
  171.             <div>
  172.             <h1>Hockey Players</h1>
  173.                 <Players changeActivePlayer={changeActivePlayer} players={players}/>
  174.                 <ActivePlayer
  175.                 changePlayerActivity={changePlayerActivity}
  176.                 deletePlayer={deletePlayer}
  177.                 player={activePlayer} />
  178.                 <Form id={nextId} addPlayer={addPlayer} />
  179.             </div>
  180.         )
  181.     }
  182.  
  183.     const mapStateToProps = state => console.log("state", state) || ({
  184.         players: state.playerReducer.players,
  185.         nextId: state.playerReducer.count,
  186.         activePlayer: state.activePlayer.selected
  187.     })
  188.  
  189.     const mapDispatchToProps = {
  190.         addPlayer,
  191.         deletePlayer,
  192.         changePlayerActivity,
  193.         changeActivePlayer
  194.     }
  195.  
  196.     const App = connect(
  197.         mapStateToProps,
  198.         mapDispatchToProps
  199.     )(Container)
  200.    
  201.    
  202.  
  203.     ReactDOM.render(
  204.         <Provider store={store}>
  205.             <App/>
  206.         </Provider>,
  207.  
  208.         document.getElementById('root')
  209.         );
  210.  
  211. </script>
  212. </body>
  213.  
  214. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement