App.js 1.7 KB

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