diff --git a/music/auth/auth.py b/music/auth/auth.py
index 5e10df5..520afe3 100644
--- a/music/auth/auth.py
+++ b/music/auth/auth.py
@@ -114,7 +114,7 @@ def auth():
'client_id': client_id,
'response_type': 'code',
'scope': 'playlist-modify-public playlist-modify-private playlist-read-private user-read-playback-state user-modify-playback-state user-library-read',
- 'redirect_uri': 'https://spotify.sarsoo.xyz/auth/spotify/token'
+ 'redirect_uri': 'https://music.sarsoo.xyz/auth/spotify/token'
}
)
@@ -141,7 +141,7 @@ def token():
data = {
'grant_type': 'authorization_code',
'code': code,
- 'redirect_uri': 'https://spotify.sarsoo.xyz/auth/spotify/token'
+ 'redirect_uri': 'https://music.sarsoo.xyz/auth/spotify/token'
}
req = requests.post('https://accounts.spotify.com/api/token', data=data, headers=headers)
diff --git a/music/templates/base.html b/music/templates/base.html
index b09bef7..7163c18 100644
--- a/music/templates/base.html
+++ b/music/templates/base.html
@@ -5,6 +5,7 @@
+
diff --git a/package-lock.json b/package-lock.json
index 9647401..a2b1793 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -997,6 +997,88 @@
"to-fast-properties": "^2.0.0"
}
},
+ "@emotion/hash": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz",
+ "integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A=="
+ },
+ "@material-ui/core": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.0.tgz",
+ "integrity": "sha512-zrrr8mPU5DDBYaVil4uJYauW41PjSn5otn7cqGsmWOY0t90fypr9nNgM7rRJaPz2AP6oRSDx1kBQt2igf5uelg==",
+ "requires": {
+ "@babel/runtime": "^7.4.4",
+ "@material-ui/styles": "^4.9.0",
+ "@material-ui/system": "^4.7.1",
+ "@material-ui/types": "^5.0.0",
+ "@material-ui/utils": "^4.7.1",
+ "@types/react-transition-group": "^4.2.0",
+ "clsx": "^1.0.2",
+ "convert-css-length": "^2.0.1",
+ "hoist-non-react-statics": "^3.2.1",
+ "normalize-scroll-left": "^0.2.0",
+ "popper.js": "^1.14.1",
+ "prop-types": "^15.7.2",
+ "react-is": "^16.8.0",
+ "react-transition-group": "^4.3.0"
+ }
+ },
+ "@material-ui/icons": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.5.1.tgz",
+ "integrity": "sha512-YZ/BgJbXX4a0gOuKWb30mBaHaoXRqPanlePam83JQPZ/y4kl+3aW0Wv9tlR70hB5EGAkEJGW5m4ktJwMgxQAeA==",
+ "requires": {
+ "@babel/runtime": "^7.4.4"
+ }
+ },
+ "@material-ui/styles": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.9.0.tgz",
+ "integrity": "sha512-nJHum4RqYBPWsjL/9JET8Z02FZ9gSizlg/7LWVFpIthNzpK6OQ5OSRR4T4x9/p+wK3t1qNn3b1uI4XpnZaPxOA==",
+ "requires": {
+ "@babel/runtime": "^7.4.4",
+ "@emotion/hash": "^0.7.4",
+ "@material-ui/types": "^5.0.0",
+ "@material-ui/utils": "^4.7.1",
+ "clsx": "^1.0.2",
+ "csstype": "^2.5.2",
+ "hoist-non-react-statics": "^3.2.1",
+ "jss": "^10.0.3",
+ "jss-plugin-camel-case": "^10.0.3",
+ "jss-plugin-default-unit": "^10.0.3",
+ "jss-plugin-global": "^10.0.3",
+ "jss-plugin-nested": "^10.0.3",
+ "jss-plugin-props-sort": "^10.0.3",
+ "jss-plugin-rule-value-function": "^10.0.3",
+ "jss-plugin-vendor-prefixer": "^10.0.3",
+ "prop-types": "^15.7.2"
+ }
+ },
+ "@material-ui/system": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.7.1.tgz",
+ "integrity": "sha512-zH02p+FOimXLSKOW/OT2laYkl9bB3dD1AvnZqsHYoseUaq0aVrpbl2BGjQi+vJ5lg8w73uYlt9zOWzb3+1UdMQ==",
+ "requires": {
+ "@babel/runtime": "^7.4.4",
+ "@material-ui/utils": "^4.7.1",
+ "prop-types": "^15.7.2"
+ }
+ },
+ "@material-ui/types": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.0.0.tgz",
+ "integrity": "sha512-UeH2BuKkwDndtMSS0qgx1kCzSMw+ydtj0xx/XbFtxNSTlXydKwzs5gVW5ZKsFlAkwoOOQ9TIsyoCC8hq18tOwg=="
+ },
+ "@material-ui/utils": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.7.1.tgz",
+ "integrity": "sha512-+ux0SlLdlehvzCk2zdQ3KiS3/ylWvuo/JwAGhvb8dFVvwR21K28z0PU9OQW2PGogrMEdvX3miEI5tGxTwwWiwQ==",
+ "requires": {
+ "@babel/runtime": "^7.4.4",
+ "prop-types": "^15.7.2",
+ "react-is": "^16.8.0"
+ }
+ },
"@types/anymatch": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz",
@@ -1032,6 +1114,28 @@
"integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==",
"dev": true
},
+ "@types/prop-types": {
+ "version": "15.7.3",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
+ "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw=="
+ },
+ "@types/react": {
+ "version": "16.9.19",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.19.tgz",
+ "integrity": "sha512-LJV97//H+zqKWMms0kvxaKYJDG05U2TtQB3chRLF8MPNs+MQh/H1aGlyDUxjaHvu08EAGerdX2z4LTBc7ns77A==",
+ "requires": {
+ "@types/prop-types": "*",
+ "csstype": "^2.2.0"
+ }
+ },
+ "@types/react-transition-group": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.3.tgz",
+ "integrity": "sha512-Hk8jiuT7iLOHrcjKP/ZVSyCNXK73wJAUz60xm0mVhiRujrdiI++j4duLiL282VGxwAgxetHQFfqA29LgEeSkFA==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
"@types/tapable": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz",
@@ -1895,6 +1999,11 @@
"wrap-ansi": "^5.1.0"
}
},
+ "clsx": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.0.4.tgz",
+ "integrity": "sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg=="
+ },
"collection-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -1966,6 +2075,11 @@
"integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
"dev": true
},
+ "convert-css-length": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/convert-css-length/-/convert-css-length-2.0.1.tgz",
+ "integrity": "sha512-iGpbcvhLPRKUbBc0Quxx7w/bV14AC3ItuBEGMahA5WTYqB8lq9jH0kTXFheCBASsYnqeMFZhiTruNxr1N59Axg=="
+ },
"convert-source-map": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
@@ -2108,12 +2222,26 @@
"schema-utils": "^2.6.0"
}
},
+ "css-vendor": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.7.tgz",
+ "integrity": "sha512-VS9Rjt79+p7M0WkPqcAza4Yq1ZHrsHrwf7hPL/bjQB+c1lwmAI+1FXxYTYt818D/50fFVflw0XKleiBN5RITkg==",
+ "requires": {
+ "@babel/runtime": "^7.6.2",
+ "is-in-browser": "^1.0.2"
+ }
+ },
"cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
"dev": true
},
+ "csstype": {
+ "version": "2.6.8",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz",
+ "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA=="
+ },
"cyclist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
@@ -2233,6 +2361,15 @@
"randombytes": "^2.0.0"
}
},
+ "dom-helpers": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.3.tgz",
+ "integrity": "sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw==",
+ "requires": {
+ "@babel/runtime": "^7.6.3",
+ "csstype": "^2.6.7"
+ }
+ },
"domain-browser": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
@@ -3490,6 +3627,11 @@
"integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
"dev": true
},
+ "hyphenate-style-name": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz",
+ "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ=="
+ },
"icss-utils": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
@@ -3683,6 +3825,11 @@
"is-extglob": "^2.1.1"
}
},
+ "is-in-browser": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz",
+ "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU="
+ },
"is-number": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
@@ -3812,6 +3959,83 @@
}
}
},
+ "jss": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/jss/-/jss-10.0.3.tgz",
+ "integrity": "sha512-AcDvFdOk16If9qvC9KN3oFXsrkHWM9+TaPMpVB9orm3z+nq1Xw3ofHyflRe/mkSucRZnaQtlhZs1hdP3DR9uRw==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "csstype": "^2.6.5",
+ "is-in-browser": "^1.1.3",
+ "tiny-warning": "^1.0.2"
+ }
+ },
+ "jss-plugin-camel-case": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.3.tgz",
+ "integrity": "sha512-rild/oFKFkmRP7AoiX9D6bdDAUfmJv8c7sEBvFoi+JP31dn2W8nw4txMKGnV1LJKlFkYprdZt1X99Uvztl1hug==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "hyphenate-style-name": "^1.0.3",
+ "jss": "^10.0.3"
+ }
+ },
+ "jss-plugin-default-unit": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.3.tgz",
+ "integrity": "sha512-n+XfVLPF9Qh7IOTdQ8M4oRpjpg6egjr/r0NNytubbCafMgCILJYIVrMTGgOTydH+uvak8onQY3f/F9hasPUx6g==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "jss": "^10.0.3"
+ }
+ },
+ "jss-plugin-global": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.0.3.tgz",
+ "integrity": "sha512-kNotkAciJIXpIGYnmueaIifBne9rdq31O8Xq1nF7KMfKlskNRANTcEX5rVnsGKl2yubTMYfjKBFCeDgcQn6+gA==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "jss": "^10.0.3"
+ }
+ },
+ "jss-plugin-nested": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.0.3.tgz",
+ "integrity": "sha512-OMucRs9YLvWlZ3Ew+VhdgNVMwSS2zZy/2vy+s/etvopnPUzDHgCnJwdY2Wx/SlhLGERJeKKufyih2seH+ui0iw==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "jss": "^10.0.3",
+ "tiny-warning": "^1.0.2"
+ }
+ },
+ "jss-plugin-props-sort": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.3.tgz",
+ "integrity": "sha512-ufhvdCMnRcDa0tNHoZ12OcVNQQyE10yLMohxo/UIMarLV245rM6n9D19A12epjldRgyiS13SoSyLFCJEobprYg==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "jss": "^10.0.3"
+ }
+ },
+ "jss-plugin-rule-value-function": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.3.tgz",
+ "integrity": "sha512-RWwIT2UBAIwf3f6DQtt5gyjxHMRJoeO9TQku+ueR8dBMakqSSe8vFwQNfjXEoe0W+Tez5HZCTkZKNMulv3Z+9A==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "jss": "^10.0.3"
+ }
+ },
+ "jss-plugin-vendor-prefixer": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.3.tgz",
+ "integrity": "sha512-zVs6e5z4tFRK/fJ5kuTLzXlTFQbLeFTVwk7lTZiYNufmZwKT0kSmnOJDUukcSe7JLGSRztjWhnHB/6voP174gw==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "css-vendor": "^2.0.7",
+ "jss": "^10.0.3"
+ }
+ },
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
@@ -4227,6 +4451,11 @@
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
+ "normalize-scroll-left": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.2.0.tgz",
+ "integrity": "sha512-t5oCENZJl8TGusJKoCJm7+asaSsPuNmK6+iEjrZ5TyBj2f02brCRsd4c83hwtu+e5d4LCSBZ0uoDlMjBo+A8yA=="
+ },
"npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@@ -4525,6 +4754,11 @@
"find-up": "^3.0.0"
}
},
+ "popper.js": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
+ "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ=="
+ },
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
@@ -4798,6 +5032,17 @@
"tiny-warning": "^1.0.0"
}
},
+ "react-transition-group": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz",
+ "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ }
+ },
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
diff --git a/package.json b/package.json
index 6b0362d..a04c0a0 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
"private": true,
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
- "build": "webpack --config webpack.prod.js",
+ "build": "webpack --config webpack.prod.js --env production",
"devbuild": "webpack --config webpack.dev.js"
},
"repository": {
@@ -19,6 +19,8 @@
},
"homepage": "https://github.com/Sarsoo/spotify-web#readme",
"dependencies": {
+ "@material-ui/core": "^4.9.0",
+ "@material-ui/icons": "^4.5.1",
"axios": "^0.19.2",
"chart.js": "^2.9.3",
"react": "^16.12.0",
diff --git a/src/js/Admin/Admin.js b/src/js/Admin/Admin.js
deleted file mode 100644
index d3c565b..0000000
--- a/src/js/Admin/Admin.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import React, { Component } from "react";
-import { BrowserRouter as Router, Route, Link } from "react-router-dom";
-const axios = require('axios');
-
-import Lock from "./Lock.js";
-import Functions from "./Functions.js";
-import Tasks from "./Tasks.js";
-
-class Admin extends Component {
- render(){
- return (
-
-
- Lock Accounts
- Functions
- Tasks
-
-
-
-
-
-
-
- );
- }
-}
-
-export default Admin
\ No newline at end of file
diff --git a/src/js/Admin/AdminRouter.js b/src/js/Admin/AdminRouter.js
new file mode 100644
index 0000000..f00417b
--- /dev/null
+++ b/src/js/Admin/AdminRouter.js
@@ -0,0 +1,52 @@
+import React, { Component } from "react";
+import { Route, Link, Switch } from "react-router-dom";
+import { Paper, Tabs, Tab} from '@material-ui/core';
+
+
+import Lock from "./Lock.js";
+import Functions from "./Functions.js";
+import Tasks from "./Tasks.js";
+
+class Admin extends Component {
+
+ constructor(props){
+ super(props);
+ this.state = {
+ tab: 0
+ }
+ this.handleChange = this.handleChange.bind(this);
+ }
+
+ handleChange(e, newValue){
+ this.setState({
+ tab: newValue
+ });
+ }
+
+ render(){
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default Admin
\ No newline at end of file
diff --git a/src/js/Admin/Functions.js b/src/js/Admin/Functions.js
index 3871c51..be600fd 100644
--- a/src/js/Admin/Functions.js
+++ b/src/js/Admin/Functions.js
@@ -2,6 +2,7 @@ import React, { Component } from "react";
const axios = require('axios');
import showMessage from "../Toast.js"
+import { Card, Button, ButtonGroup, CardContent, CardActions, Typography } from "@material-ui/core";
class Functions extends Component {
@@ -34,27 +35,20 @@ class Functions extends Component {
render () {
return (
-
-
-
-
- Admin Functions
-
-
-
-
-
-
- Run All Users
-
-
-
-
- Run Stats
-
-
-
-
);
+
+
+
+ Admin Functions
+
+
+
+ Run All Users
+ Run Stats
+
+
+
+
+ );
}
}
diff --git a/src/js/Admin/Lock.js b/src/js/Admin/Lock.js
index d04099a..56d9ad9 100644
--- a/src/js/Admin/Lock.js
+++ b/src/js/Admin/Lock.js
@@ -1,8 +1,18 @@
import React, { Component } from "react";
const axios = require('axios');
+import { Card, Button, CardActions, CardContent, Typography, Grid } from '@material-ui/core';
+import { makeStyles } from '@material-ui/core/styles';
+
import showMessage from "../Toast.js"
+const useStyles = makeStyles({
+ root: {
+ background: '#9e9e9e',
+ color: '#212121'
+ },
+ });
+
class Lock extends Component {
constructor(props){
@@ -46,42 +56,38 @@ class Lock extends Component {
const loadingMessage = loading...
;
- return this.state.isLoading ? loadingMessage :
-
-
-
-
-
-
- Account Locks
-
-
-
-
-
- { this.state.accounts.map((account) => ) }
-
-
-
;
+ return this.state.isLoading ? loadingMessage :
+
+
+
+ Account Locks
+
+ { this.state.accounts.map((account) => ) }
+
+
+
+
}
}
function Row(props){
+ const classes = useStyles();
return (
-
- { props.account.username }
-
- { props.account.last_login }
-
-
- props.handler(e, props.account.username, !props.account.locked)}>
- {props.account.locked ? "Unlock" : "Lock"}
-
-
-
+
+
+
+ { props.account.username }
+ { props.account.last_login }
+
+
+ props.handler(e, props.account.username, !props.account.locked)}>
+ {props.account.locked ? "Unlock" : "Lock"}
+
+
+
+
);
}
diff --git a/src/js/Admin/Tasks.js b/src/js/Admin/Tasks.js
index c9742cd..0d0f5b2 100644
--- a/src/js/Admin/Tasks.js
+++ b/src/js/Admin/Tasks.js
@@ -1,6 +1,8 @@
import React, { Component } from "react";
const axios = require('axios');
+import { Card, CardContent, Typography, Grid } from '@material-ui/core';
+
import showMessage from "../Toast.js"
class Tasks extends Component {
@@ -30,41 +32,26 @@ class Tasks extends Component {
}
render () {
- return (
-
-
-
-
- Running Tasks
-
-
-
- { this.state.tasks.map((entry) => )}
-
-
-
- {this.state.total_tasks} Currently Running
-
-
-
-
);
+ return (
+
+
+ { this.state.tasks.map((entry) => )}
+
+
+ );
}
}
function TaskType(props) {
return (
-
-
-
- {props.url}: {props.count}
-
-
- {props.times.map((entry) =>
-
- {entry}
-
- )}
-
+
+
+
+ {props.url}: {props.count}
+ {props.times.map((entry) => {entry} )}
+
+
+
);
}
diff --git a/src/js/Index/Index.js b/src/js/Index/Index.js
index 0f3d267..1d14848 100644
--- a/src/js/Index/Index.js
+++ b/src/js/Index/Index.js
@@ -1,5 +1,6 @@
import React, { Component } from "react";
-const axios = require('axios');
+
+import { Card, CardContent, Typography, Grid } from '@material-ui/core';
class Index extends Component{
@@ -10,37 +11,26 @@ class Index extends Component{
render(){
return (
-
-
-
-
- Music Tools
-
-
-
-
-
-
- Construct spotify playlists from selections of other playlists
-
-
-
-
- Group sub-genre playlists
-
-
-
-
- Optionally append auto-generated recommendations
-
-
-
-
- Playlists are run multiple times a day
-
-
-
-
+
+
+
+
+
+ Construct spotify playlists from selections of other playlists
+
+
+ Group sub-genre playlists
+
+
+ Optionally append auto-generated recommendations
+
+
+ Playlists are run multiple times a day
+
+
+
+
+
);
}
}
diff --git a/src/js/Maths/Maths.js b/src/js/Maths/Maths.js
deleted file mode 100644
index f8f9c42..0000000
--- a/src/js/Maths/Maths.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import React, { Component } from "react";
-import { BrowserRouter as Router, Route, Link, Switch, Redirect} from "react-router-dom";
-
-import Count from "./Count.js";
-
-class Maths extends Component {
-
- render() {
- return (
-
-
- );
- }
-}
-
-
-
-export default Maths;
\ No newline at end of file
diff --git a/src/js/Maths/MathsRouter.js b/src/js/Maths/MathsRouter.js
new file mode 100644
index 0000000..52fedcd
--- /dev/null
+++ b/src/js/Maths/MathsRouter.js
@@ -0,0 +1,15 @@
+import React, { Component } from "react";
+import { BrowserRouter as Route} from "react-router-dom";
+
+import Count from "./Count.js";
+
+class Maths extends Component {
+
+ render() {
+ return } />;
+ }
+}
+
+
+
+export default Maths;
\ No newline at end of file
diff --git a/src/js/Maths/PieChart.js b/src/js/Maths/PieChart.js
index 2cf18b1..b576449 100644
--- a/src/js/Maths/PieChart.js
+++ b/src/js/Maths/PieChart.js
@@ -21,7 +21,10 @@ class PieChart extends Component {
},
options: {
legend : {
- display : true
+ display : true,
+ labels: {
+ fontColor: 'white'
+ }
},
elements: {
arc : {
diff --git a/src/js/MusicTools.js b/src/js/MusicTools.js
index c2c081d..3f2bc6c 100644
--- a/src/js/MusicTools.js
+++ b/src/js/MusicTools.js
@@ -1,27 +1,48 @@
import React, { Component } from "react";
-import { BrowserRouter as Router, Route, Link, Switch, Redirect} from "react-router-dom";
-
-import Index from "./Index/Index.js";
-import Maths from "./Maths/Maths.js";
-import Playlists from "./Playlist/Playlists.js";
-import PlaylistView from "./Playlist/View/View.js";
-import Settings from "./Settings/Settings.js";
-import Admin from "./Admin/Admin.js";
+import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";
import NotFound from "./Error/NotFound.js";
import showMessage from "./Toast.js"
+import GlobalTheme from './Theme.js';
+
+import { Typography } from '@material-ui/core';
+import { ThemeProvider } from '@material-ui/core/styles';
+import AppBar from '@material-ui/core/AppBar';
+import Toolbar from '@material-ui/core/Toolbar';
+import IconButton from '@material-ui/core/IconButton';
+import MenuIcon from '@material-ui/icons/Menu';
+
+import Drawer from '@material-ui/core/Drawer';
+import List from '@material-ui/core/List';
+import Divider from '@material-ui/core/Divider';
+import ChevronLeftIcon from '@material-ui/icons/ChevronLeft';
+import ListItem from '@material-ui/core/ListItem';
+import ListItemIcon from '@material-ui/core/ListItemIcon';
+import ListItemText from '@material-ui/core/ListItemText';
+import HomeIcon from '@material-ui/icons/Home';
+import { Build, PieChart, QueueMusic, ExitToApp, AccountCircle, KeyboardBackspace } from '@material-ui/icons'
+
const axios = require('axios');
+const LazyIndex = React.lazy(() => import("./Index/Index"))
+const LazyMaths = React.lazy(() => import("./Maths/MathsRouter"))
+const LazyPlaylists = React.lazy(() => import("./Playlist/AllPlaylistsRouter"))
+const LazyPlaylistView = React.lazy(() => import("./Playlist/View/PlaylistRouter"))
+const LazySettings = React.lazy(() => import("./Settings/SettingsRouter"))
+const LazyAdmin = React.lazy(() => import("./Admin/AdminRouter"))
+
class MusicTools extends Component {
constructor(props){
super(props);
this.state = {
type: null,
- spotify_linked: null
+ spotify_linked: null,
+ drawerOpen: false
}
+ this.setOpen = this.setOpen.bind(this);
}
componentDidMount() {
@@ -50,41 +71,99 @@ class MusicTools extends Component {
});
}
+ setOpen(bool){
+ this.setState({
+ drawerOpen: bool
+ })
+ }
+
render(){
return (
-
-
-
- Home
- Playlists
- Maths
- Settings
- { this.state.type == 'admin' && Admin }
- Logout
- sarsoo.xyz
-
-
-
-
+
+
+
+ this.setOpen(true)}>
+
+
+
+ Music Tools
+
+
+
+ this.setOpen(false)}
+ >
+
+ this.setOpen(false)}>
+
+
+
+
+ this.setOpen(false)}
+ onKeyDown={(e) => this.setOpen(false)}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { this.state.type == 'admin' &&
+
+
+
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
- { this.state.type == 'admin' && }
-
+ }>
+
+
+
+
+ { this.state.type == 'admin' && }
+
+
-
-
+
);
}
}
+function LoadingMessage(props) {
+ return
Loading... ;
+}
+
export default MusicTools;
\ No newline at end of file
diff --git a/src/js/Playlist/Playlists.js b/src/js/Playlist/AllPlaylistsRouter.js
similarity index 52%
rename from src/js/Playlist/Playlists.js
rename to src/js/Playlist/AllPlaylistsRouter.js
index 03299dc..6f95c59 100644
--- a/src/js/Playlist/Playlists.js
+++ b/src/js/Playlist/AllPlaylistsRouter.js
@@ -1,20 +1,14 @@
import React, { Component } from "react";
-import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";
-const axios = require('axios');
+import { Route, Switch } from "react-router-dom";
-import PlaylistsView from "./PlaylistsView.js"
-import NewPlaylist from "./NewPlaylist.js";
+import PlaylistsView from "./PlaylistsList.js"
+import NewPlaylist from "./New.js";
import ScratchView from "./ScratchView.js";
class Playlists extends Component {
render(){
return (
-
-
-
+
diff --git a/src/js/Playlist/NewPlaylist.js b/src/js/Playlist/New.js
similarity index 53%
rename from src/js/Playlist/NewPlaylist.js
rename to src/js/Playlist/New.js
index c98088e..34cf4a4 100644
--- a/src/js/Playlist/NewPlaylist.js
+++ b/src/js/Playlist/New.js
@@ -1,7 +1,8 @@
import React, { Component } from "react";
-import { BrowserRouter as Redirect } from "react-router-dom";
const axios = require('axios');
+import { Card, Button, FormControl, TextField, InputLabel, Select, CardActions, CardContent, Typography, Grid } from '@material-ui/core';
+
import showMessage from "../Toast.js"
class NewPlaylist extends Component {
@@ -82,44 +83,51 @@ class NewPlaylist extends Component {
render(){
return (
-
+ inputProps={{
+ name: 'type',
+ id: 'type-select',
+ }}
+ className="full-width"
+ >
+ Default
+ Recents
+ Last.fm Chart
+
+
+
+
+
+
+
+ { this.state.description }
+
+
+
+
+ Create
+
+
+
);
}
diff --git a/src/js/Playlist/PlaylistsView.js b/src/js/Playlist/PlaylistsList.js
similarity index 63%
rename from src/js/Playlist/PlaylistsView.js
rename to src/js/Playlist/PlaylistsList.js
index b0035c9..5dc37a1 100644
--- a/src/js/Playlist/PlaylistsView.js
+++ b/src/js/Playlist/PlaylistsList.js
@@ -1,5 +1,8 @@
import React, { Component } from "react";
-import { BrowserRouter as Router, Route, Link } from "react-router-dom";
+import { Link } from "react-router-dom";
+import { Button, ButtonGroup, Typography, Card, Grid, CircularProgress } from '@material-ui/core';
+import CardActions from '@material-ui/core/CardActions';
+import CardContent from '@material-ui/core/CardContent';
const axios = require('axios');
import showMessage from "../Toast.js"
@@ -90,58 +93,66 @@ class PlaylistsView extends Component {
render() {
- const table =
;
- const loadingMessage = loading...
;
-
- return this.state.isLoading ? loadingMessage : table;
+ return this.state.isLoading ? : grid;
}
}
-function Table(props){
+function PlaylistGrid(props){
return (
-
+
+
+
+ New
+ Run All
+
+
{ props.playlists.length == 0 ? (
-
-
-
- No Playlists
-
-
-
+
+ No Playlists
+
) : (
-
- { props.playlists.map((playlist) => ) }
-
- Run All
-
-
+ key={ playlist.name }/>)
)}
-
+
);
}
-function Row(props){
+function PlaylistCard(props){
return (
-
-
- props.handleRunPlaylist(props.playlist.name, e)}>Run
- props.handleDeletePlaylist(props.playlist.name, e)}>Delete
-
- );
-}
-
-function PlaylistLink(props){
- return (
-
- { props.playlist.name }
-
+
+
+
+
+ { props.playlist.name }
+
+
+
+
+ View
+ props.handleRunPlaylist(props.playlist.name, e)}>Run
+ props.handleDeletePlaylist(props.playlist.name, e)}>Delete
+
+
+
+
);
}
diff --git a/src/js/Playlist/View/Count.js b/src/js/Playlist/View/Count.js
index 40070a5..9910df8 100644
--- a/src/js/Playlist/View/Count.js
+++ b/src/js/Playlist/View/Count.js
@@ -1,10 +1,13 @@
import React, { Component } from "react";
const axios = require('axios');
-import showMessage from "../../Toast.js"
-import PieChart from "../../Maths/PieChart.js";
+import { Card, Button, CardActions, CardContent, Typography, Grid } from '@material-ui/core';
-class Count extends Component {
+import showMessage from "../../Toast.js"
+
+const LazyPieChart = React.lazy(() => import("../../Maths/PieChart"))
+
+export class Count extends Component {
constructor(props){
super(props);
@@ -64,34 +67,35 @@ class Count extends Component {
render() {
return (
-
-
- Scrobble Count: {this.state.playlist.lastfm_stat_count.toLocaleString()} / {this.state.playlist.lastfm_stat_percent}%
-
-
- Album Count: {this.state.playlist.lastfm_stat_album_count.toLocaleString()} / {this.state.playlist.lastfm_stat_album_percent}%
-
-
- Artist Count: {this.state.playlist.lastfm_stat_artist_count.toLocaleString()} / {this.state.playlist.lastfm_stat_artist_percent}%
-
-
- Last Updated {this.state.playlist.lastfm_stat_last_refresh.toLocaleString()}
-
-
-
-
-
-
-
-
-
+
+
+
+
+ Scrobble Count: {this.state.playlist.lastfm_stat_count.toLocaleString()} / {this.state.playlist.lastfm_stat_percent}%
+
+
+ Album Count: {this.state.playlist.lastfm_stat_album_count.toLocaleString()} / {this.state.playlist.lastfm_stat_album_percent}%
+
+
+ Artist Count: {this.state.playlist.lastfm_stat_artist_count.toLocaleString()} / {this.state.playlist.lastfm_stat_artist_percent}%
+
+
+ Last Updated {this.state.playlist.lastfm_stat_last_refresh.toLocaleString()}
+
+ }>
+
+
+
+
+
-
-
-
-
-
-
-
-
-
- Update
-
-
-
+
+
+
+
+
+
+
+
+ Update
+
+
+
);
}
}
-export default Count;
\ No newline at end of file
+function LoadingMessage(props) {
+ return Loading... ;
+}
\ No newline at end of file
diff --git a/src/js/Playlist/View/Edit.js b/src/js/Playlist/View/Edit.js
index 60d886e..4745855 100644
--- a/src/js/Playlist/View/Edit.js
+++ b/src/js/Playlist/View/Edit.js
@@ -1,6 +1,11 @@
import React, { Component } from "react";
const axios = require('axios');
+import { Card, Button, CircularProgress, FormControl, TextField, InputLabel, Select, Checkbox, FormControlLabel,
+ CardActions, CardContent, Typography, Grid } from '@material-ui/core';
+import { Delete } from '@material-ui/icons';
+import { makeStyles } from '@material-ui/core/styles';
+
import showMessage from "../../Toast.js";
var thisMonth = [
@@ -33,7 +38,15 @@ var lastMonth = [
'november'
];
-class Edit extends Component{
+
+const useStyles = makeStyles({
+ root: {
+ background: '#9e9e9e',
+ color: '#212121'
+ },
+ });
+
+export class Edit extends Component{
constructor(props){
super(props);
@@ -112,7 +125,7 @@ class Edit extends Component{
getPlaylistInfo(){
return axios.get(`/api/playlist?name=${ this.state.name }`);
- }
+ }
getPlaylists(){
return axios.get(`/api/playlists`);
@@ -155,7 +168,7 @@ class Edit extends Component{
showMessage(`Error Updating Boundary Value (${error.response.status})`);
});
}
-
+
handleRecommendationsSampleChange(sample){
if(sample == ''){
sample = 0;
@@ -393,196 +406,168 @@ class Edit extends Component{
var date = new Date();
const table = (
-
- { this.state.playlist_references.length > 0 && Managed }
- { this.state.playlist_references.length > 0 && }
+
+
+
+ {this.state.name}
+
+
+ { this.state.playlist_references.length > 0 && Managed }
+ { this.state.playlist_references.length > 0 && }
- { this.state.parts.length > 0 && Spotify }
- { this.state.parts.length > 0 && }
-
-
- Spotify playlist can be the name of either your own created playlist or one you follow, names are case sensitive
-
-
-
-
-
-
-
- Add
-
-
-
-
-
- { this.state.playlists
- .filter((entry) => entry.name != this.state.name)
- .map((entry) => ) }
-
-
-
- Add
-
-
-
-
- Shuffle Output
-
-
-
-
-
-
-
- Include Recommendations
-
-
-
-
-
-
-
- Include Library Tracks
-
-
-
-
-
-
-
- Recommendation Size
-
-
-
-
-
-
- { this.state.type == 'fmchart' &&
-
-
- Chart Size
-
-
-
-
-
- }
- { this.state.type == 'fmchart' &&
-
-
- Chart Range
-
-
-
- 7 Day
- 30 Day
- 90 Day
- 180 Day
- 365 Day
- Overall
-
-
-
- }
-
- { this.state.type == 'recents' &&
-
-
- Added Since (days)
-
-
-
-
-
- }
- { this.state.type == 'recents' &&
-
-
- Include {thisMonth[date.getMonth()]} Playlist
-
-
-
-
-
- }
- { this.state.type == 'recents' &&
-
-
- Include {lastMonth[date.getMonth()]} Playlist
-
-
-
-
-
- }
-
-
-
-
- Type
-
-
- 0 && Spotify }
+ { this.state.parts.length > 0 && }
+ Spotify playlist can be the name of either your own created playlist or one you follow, names are case sensitive
+
+
- Default
- Recents
- Last.fm Chart
-
-
-
-
-
- Run
-
-
-
+
+ />
+
+
+ Add
+
+
+
+ Managed Playlist
+
+ { this.state.playlists
+ .filter((entry) => entry.name != this.state.name)
+ .map((entry) => ) }
+
+
+
+
+ Add
+
+
+
+ }
+ labelPlacement="bottom"
+ label="Shuffle"/>
+
+ }
+ labelPlacement="bottom"
+ label="Recommendations"/>
+
+ }
+ labelPlacement="bottom"
+ label="Library Tracks"/>
+
+
+
+
+
+ { this.state.type == 'fmchart' &&
+
+
+
+ }
+ { this.state.type == 'fmchart' &&
+
+
+ Chart Range
+
+ 7 Day
+ 30 Day
+ 90 Day
+ 180 Day
+ 365 Day
+ Overall
+
+
+
+ }
+ { this.state.type == 'recents' &&
+
+
+
+ }
+ { this.state.type == 'recents' &&
+
+
+ }
+ label="This Month"
+ labelPlacement="bottom"
+ />
+
+ }
+ label="Last Month"
+ labelPlacement="bottom"
+ />
+
+ }
+
+
+ Type
+
+ Default
+ Recents
+ Last.fm Chart
+
+
+
+
+
+
+ Run
+
+
+
);
- const loadingMessage =
-
-
-
- Loading...
-
-
- ;
-
- return this.state.isLoading ? loadingMessage : table;
+ return this.state.isLoading ? : table;
}
}
@@ -592,16 +577,30 @@ function ReferenceEntry(props) {
}
function ListBlock(props) {
- return props.list.map((part) => );
+ return
+ {props.list.map((part) => )}
+
}
-function Row (props) {
+function BlockGridItem (props) {
+ const classes = useStyles();
return (
-
- { props.part }
- props.handler(props.part, e)}>Remove
-
+
+
+
+ { props.part }
+
+
+ props.handler(props.part, e)} startIcon={ }>
+ Delete
+
+
+
+
);
-}
-
-export default Edit;
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/src/js/Playlist/View/PlaylistRouter.js b/src/js/Playlist/View/PlaylistRouter.js
new file mode 100644
index 0000000..3bd5c5e
--- /dev/null
+++ b/src/js/Playlist/View/PlaylistRouter.js
@@ -0,0 +1,50 @@
+import React, { Component } from "react";
+import { Route, Link, Switch } from "react-router-dom";
+import { Paper, Tabs, Tab} from '@material-ui/core';
+
+
+import {Edit} from "./Edit.js";
+import {Count} from "./Count.js";
+
+class View extends Component{
+
+ constructor(props){
+ super(props);
+ this.state = {
+ tab: 0
+ }
+ this.handleChange = this.handleChange.bind(this);
+ }
+
+ handleChange(e, newValue){
+ this.setState({
+ tab: newValue
+ });
+ }
+
+ render() {
+ return (
+
+
+
+
+
+
+
+
+ } />
+ } />
+
+
+ );
+ }
+
+}
+
+export default View;
\ No newline at end of file
diff --git a/src/js/Playlist/View/View.js b/src/js/Playlist/View/View.js
deleted file mode 100644
index 1c3ed74..0000000
--- a/src/js/Playlist/View/View.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import React, { Component } from "react";
-import { BrowserRouter as Router, Route, Link, Switch, Redirect} from "react-router-dom";
-const axios = require('axios');
-
-import Edit from "./Edit.js";
-import Count from "./Count.js";
-
-class View extends Component{
-
- render() {
- return (
-
-
-
- { this.props.match.params.name }
-
-
-
-
-
-
-
- } />
- } />
-
- );
- }
-
-}
-
-export default View;
\ No newline at end of file
diff --git a/src/js/Settings/ChangePassword.js b/src/js/Settings/ChangePassword.js
index 2cdb810..5b1f074 100644
--- a/src/js/Settings/ChangePassword.js
+++ b/src/js/Settings/ChangePassword.js
@@ -1,6 +1,8 @@
import React, { Component } from "react";
const axios = require('axios');
+import { Card, Grid, Button, TextField, CardContent, CardActions, Typography } from "@material-ui/core";
+
import showMessage from "../Toast.js"
class ChangePassword extends Component {
@@ -63,49 +65,52 @@ class ChangePassword extends Component {
render(){
return (
-
-
- { this.state.error &&
{this.state.errorValue}
}
+ name="new2"
+ value={this.state.new2}
+ className="full-width" />
+
+ { this.state.error &&
{this.state.errorValue} }
+
+
+
+ Change
+
+
+
);
}
diff --git a/src/js/Settings/LastFM.js b/src/js/Settings/LastFM.js
index 88174d1..3f673bd 100644
--- a/src/js/Settings/LastFM.js
+++ b/src/js/Settings/LastFM.js
@@ -1,6 +1,8 @@
import React, { Component } from "react";
const axios = require('axios');
+import { Card, Button, CardContent, CardActions, Typography, TextField, Grid } from "@material-ui/core";
+
import showMessage from "../Toast.js"
class LastFM extends Component {
@@ -64,30 +66,32 @@ class LastFM extends Component {
}
render(){
- const table =
-
-
- ;
+ const table =
+
+
+
+
+
+
+ Last.fm Username
+
+
+
+
+
+
+
+ Save
+
+
+
+
;
const loadingMessage = Loading...
;
diff --git a/src/js/Settings/Settings.js b/src/js/Settings/Settings.js
deleted file mode 100644
index a664e49..0000000
--- a/src/js/Settings/Settings.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import React, { Component } from "react";
-import { BrowserRouter as Router, Route, Link, Switch, Redirect} from "react-router-dom";
-
-import ChangePassword from "./ChangePassword.js";
-import SpotifyLink from "./SpotifyLink.js";
-import LastFM from "./LastFM.js";
-
-class Settings extends Component {
-
- render() {
- return (
-
-
- Password
- Spotify
- Last.fm
-
-
-
-
-
-
-
- );
- }
-}
-
-
-
-export default Settings;
\ No newline at end of file
diff --git a/src/js/Settings/SettingsRouter.js b/src/js/Settings/SettingsRouter.js
new file mode 100644
index 0000000..ae7fef7
--- /dev/null
+++ b/src/js/Settings/SettingsRouter.js
@@ -0,0 +1,53 @@
+import React, { Component } from "react";
+import { Route, Link, Switch } from "react-router-dom";
+import { Paper, Tabs, Tab} from '@material-ui/core';
+
+import ChangePassword from "./ChangePassword.js";
+import SpotifyLink from "./SpotifyLink.js";
+import LastFM from "./LastFM.js";
+
+class Settings extends Component {
+
+ constructor(props){
+ super(props);
+ this.state = {
+ tab: 0
+ }
+ this.handleChange = this.handleChange.bind(this);
+ }
+
+ handleChange(e, newValue){
+ this.setState({
+ tab: newValue
+ });
+ }
+
+ render() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+
+
+export default Settings;
\ No newline at end of file
diff --git a/src/js/Settings/SpotifyLink.js b/src/js/Settings/SpotifyLink.js
index 41efe8c..7d82a7f 100644
--- a/src/js/Settings/SpotifyLink.js
+++ b/src/js/Settings/SpotifyLink.js
@@ -1,6 +1,8 @@
import React, { Component } from "react";
const axios = require('axios');
+import { Card, Button, CardContent, CardActions, Typography } from "@material-ui/core";
+
import showMessage from "../Toast.js"
class SpotifyLink extends Component {
@@ -29,25 +31,17 @@ class SpotifyLink extends Component {
render(){
const table =
-
-
-
- Spotify Link
-
-
-
-
-
- Status: { this.state.spotify_linked ? "Linked" : "Unlinked" }
-
-
-
-
- { this.state.spotify_linked ? : }
-
-
-
-
;
+
+
+
+ Admin Functions
+ Status: { this.state.spotify_linked ? "Linked" : "Unlinked" }
+
+
+ { this.state.spotify_linked ? : }
+
+
+
;
const loadingMessage = Loading...
;
@@ -56,11 +50,11 @@ class SpotifyLink extends Component {
}
function AuthButton(props) {
- return Auth ;
+ return Auth ;
}
function DeAuthButton(props) {
- return De-Auth ;
+ return De-Auth ;
}
export default SpotifyLink;
\ No newline at end of file
diff --git a/src/js/Theme.js b/src/js/Theme.js
new file mode 100644
index 0000000..c8780f7
--- /dev/null
+++ b/src/js/Theme.js
@@ -0,0 +1,42 @@
+import { createMuiTheme, responsiveFontSizes } from '@material-ui/core/styles';
+
+let GlobalTheme = createMuiTheme({
+ root: {
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ },
+ spacing: 4,
+ typography: {
+ button: {
+ fontSize: '1rem',
+ },
+ },
+ paper: {
+ display: 'flex',
+ spacing: 5
+ },
+ card: {
+ marginTop: 24,
+ display: 'flex',
+ spacing: 5
+ },
+ palette: {
+ type: 'dark',
+ primary: {
+ main: '#1976d2',
+ },
+ secondary: {
+ main: '#dc004e',
+ },
+ error: {
+ main: '#f44336'
+ }
+ },
+ status: {
+ danger: 'orange',
+ }
+});
+GlobalTheme = responsiveFontSizes(GlobalTheme);
+
+export default GlobalTheme;
\ No newline at end of file
diff --git a/webpack.common.js b/webpack.common.js
index 1a357b5..0a3ea8c 100644
--- a/webpack.common.js
+++ b/webpack.common.js
@@ -27,7 +27,9 @@ module.exports = {
],
resolve: { extensions: ["*", ".js", ".jsx"] },
output: {
- filename: '[name].bundle.js',
- path: path.resolve(__dirname, 'build/js')
+ filename: '[name].bundle.js',
+ chunkFilename: '[name].bundle.js',
+ path: path.resolve(__dirname, 'build/js'),
+ publicPath: '/build/js/'
}
};