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
>
)
}
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'}
{(playlist[0]?.tracks || []).map(track =>
>
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:
{(tracks || []).map(track =>
>
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 (
<>
>
)
}
const PlayerConnect = connect(
state => ({
user: state.promise.userData || {},
playlists: state.promise.userPlaylists || {}
}),
{
onLogout: action.actionAuthLogout,
}
)(Player)
function App() {
return (
);
}
export default App;