import './App.css'; import * as action from './actions' import * as reducer from './reducers' import thunk from 'redux-thunk'; import { useEffect, useState } from 'react'; import { createStore, combineReducers, applyMiddleware } from 'redux'; import { Provider, connect } from 'react-redux'; import { Link, Route, Router, Switch, Redirect } from 'react-router-dom'; import createHistory from 'history/createBrowserHistory' export const getGQL = url => (query, variables = {}) => fetch(url, { method: 'POST', headers: { "Content-Type": "application/json", ...(localStorage.authToken ? { "Authorization": "Bearer " + localStorage.authToken } : {}) }, body: JSON.stringify({ query, variables }) }) .then(res => res.json()) .then(data => { if (data.errors && !data.data) throw new Error(JSON.stringify(data.errors)) return data.data[Object.keys(data.data)[0]] }) const history = createHistory() const backendURL = "http://player.asmer.fs.a-level.com.ua" export const gql = getGQL(backendURL + '/graphql') const store = createStore( combineReducers( { promise: reducer.promiseReducer, auth: reducer.authReducer, //local: localStoreReducer(promiseReducer, 'locale') } ), applyMiddleware(thunk) ) store.subscribe(() => console.log(store.getState())) //works only once on start of page if(store.getState().auth?.token) { history.push('/player') store.dispatch(action.actionGetUserData()) store.dispatch(action.actionGetUserPlaylists()) } else { history.push('/login') } export function jwtDecode(token) { try { let decoded = token.split('.') decoded = decoded[1] decoded = atob(decoded) decoded = JSON.parse(decoded) return decoded } catch (e) { return; } } const LoginForm = ({ loged, onLogin }) => { let [login, setLogin] = useState() let [password, setPassword] = useState() let [log, setLog] = useState() useEffect(() => { setLog(loged) if (log?.payload && localStorage.authToken) history.push('/player') }, [loged, log]) return ( <>

Web-player

Log-in

setLogin(e.target.value)} />
setPassword(e.target.value)} />
{loged.status === 'REJECTED' || (loged.status === 'RESOLVED' && !loged.payload) ? 'invalid login or password' : ''}

- OR -

Register new user
) } const LoginFormConnect = connect(state => ({ loged: state.promise.login || {} }), { onLogin: action.actionFullLogin })(LoginForm) const RegisterForm = ({ onRegister }) => { let [login, setLogin] = useState() let [password, setPassword] = useState() let [password2, setPassword2] = useState() return ( <>

Web-player

Registration

setLogin(e.target.value)} />
setPassword(e.target.value)} />
setPassword2(e.target.value)} />
{password2 && password2 !== password ? 'Passwords do not match' : ''}

Back to log-in page
) } const RegisterFormConnect = connect(null, { onRegister: action.actionRegister })(RegisterForm) const PlaylistAdd = ({addPlaylist}) => { let [clicked, setClicked] = useState(false) let [name, setName] = useState() return (
{ !clicked? :
setName(e.target.value)} />
}
) } const PlaylistAddConnect = connect(null, {addPlaylist: action.actionAddPlaylist})(PlaylistAdd) const Playlists = ({playlists}) => { return (
{ playlists?.payload? playlists.payload.map(item => { return ( {item.name} ) }) : '' }
) } const PlaylistsConnect = connect(state => ({playlists: state.promise.userPlaylists || {}}))(Playlists) const Track = ({track:{url, originalFileName, id3:{title, artist, album}}}) =>

  • {artist || 'Artist: unknown'}
    {album || 'Album: unknown'}
    {title || originalFileName}

    {url}

  • const Playlist = ({playlist}) => <>

    {playlist[0]?.name || 'Playlist'}

    const PlaylistConnect = connect(state => ({playlist: state.promise.playlistTracks?.payload || []}))(Playlist) const PlaylistPage = ({match: {params: {_id}}, getTracks}) => { useEffect(() => { console.log('BANG', _id) getTracks(_id.substring(1)) //getTracks() }, [_id]) return() } const PlaylistPageConnect = connect(null, {getTracks: action.actionGetPlaylistById})(PlaylistPage) const UserTracks = ({user, tracks}) => <>

    { user.login || 'My' } tracks:

    const UserTracksConnect = connect(state => ({ tracks: state.promise.userTracks?.payload || [], user: state.promise.userData?.payload || {} }) )(UserTracks) const UserTracksPage = ({match: {params: {_id}}, getUserTracks}) => { useEffect(() => { getUserTracks() },[_id]) return() } const UserTracksPageConnect = connect(null, {getUserTracks: action.actionGetUserTracks})(UserTracksPage) const Player = ({ user, playlists, onLogout }) => { let [userInfo, setUserInfo] = useState(user.payload) let [userPlaylists, setPlaylists] = useState(user.payload) useEffect(()=> { setUserInfo(user.payload) setPlaylists(playlists.payload) console.log(userPlaylists) },[user, playlists, userInfo, userPlaylists]) return ( <>
    Player
    back stop forw
    ) } const PlayerConnect = connect( state => ({ user: state.promise.userData || {}, playlists: state.promise.userPlaylists || {} }), { onLogout: action.actionAuthLogout, } )(Player) function App() { return (
    ); } export default App;