App.js 1.6 KB

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