App.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { BaseLink, useRoute } from 'react-router5'
  2. import {useReducer} from 'react';
  3. import './App.css';
  4. import logo from './chad-logo-256.png';
  5. import {storeToken, loadToken} from './Api';
  6. import Login from './Login';
  7. import Settings from './Settings';
  8. import UserInfo from './UserInfo';
  9. import Player from './Player';
  10. function storeSettings(settings) {
  11. localStorage.setItem('settings', JSON.stringify(settings));
  12. return settings;
  13. }
  14. function loadSettings() {
  15. const settings = localStorage.getItem('settings');
  16. return (settings && JSON.parse(settings)) || {login:{}, theme:'light', layout:'two-col'};
  17. }
  18. function settingsReducer(state, action) {
  19. console.log(action);
  20. switch(action.type) {
  21. case 'LOGIN_SUCCESS':
  22. storeToken(action.payload);
  23. return {...state, login: {loading: false, error: null}};
  24. case 'LOGIN_INIT': return {...state, login: {loading: true, error: null}};
  25. case 'LOGIN_FAIL': return {...state, login: {loading: false, error: action.payload}};
  26. case 'LAYOUT_SET': return storeSettings({...state, layout: action.payload});
  27. case 'THEME_SET': return storeSettings({...state, theme: action.payload});
  28. default: throw new Error(`Bad action ${action}`);
  29. }
  30. }
  31. function App() {
  32. const { router } = useRoute()
  33. const [settings, dispatch] = useReducer(settingsReducer, loadSettings());
  34. if(!loadToken()) {
  35. return <Login state={settings} dispatch={dispatch} />
  36. }
  37. return (
  38. <div className="App" data-theme={settings.theme} data-layout={settings.layout}>
  39. <header className="App-header">
  40. <BaseLink router={router} routeName="browser" routeOptions={{ reload: true }}>
  41. <img src={logo} className="App-logo" alt="Chad music" />
  42. </BaseLink>
  43. <h1 className="App-title">Chad Music</h1>
  44. <Settings state={settings} dispatch={dispatch} />
  45. <UserInfo/>
  46. </header>
  47. <Player />
  48. </div>
  49. );
  50. }
  51. export default App;