From 849c0a5fa679599209206b81069f367efac98e4e Mon Sep 17 00:00:00 2001 From: aj Date: Sat, 19 Oct 2019 17:57:56 +0100 Subject: [PATCH] added frontend for last.fm username updating fixed password updating changed password statuses from text to toast added maths menu item --- music/api/api.py | 23 +++++--- src/js/Maths/Maths.js | 18 ++++++ src/js/PlaylistManager.js | 7 ++- src/js/Settings/ChangePassword.js | 32 +++------- src/js/Settings/LastFM.js | 98 +++++++++++++++++++++++++++++++ src/js/Settings/Settings.js | 3 + 6 files changed, 146 insertions(+), 35 deletions(-) create mode 100644 src/js/Maths/Maths.js create mode 100644 src/js/Settings/LastFM.js diff --git a/music/api/api.py b/music/api/api.py index 36edb0d..be46ee8 100644 --- a/music/api/api.py +++ b/music/api/api.py @@ -227,7 +227,8 @@ def user(username=None): 'username': pulled_user['username'], 'type': pulled_user['type'], 'spotify_linked': pulled_user['spotify_linked'], - 'validated': pulled_user['validated'] + 'validated': pulled_user['validated'], + 'lastfm_username': pulled_user['lastfm_username'] } return jsonify(response), 200 @@ -239,10 +240,10 @@ def user(username=None): request_json = request.get_json() - if 'username' not in request_json: - return jsonify({'status': 'error', 'message': 'no username provided'}), 400 + if 'username' in request_json: + username = request_json['username'] - actionable_user = database.get_user_doc_ref(request_json['username']) + actionable_user = database.get_user_doc_ref(username) if actionable_user.get().exists is False: return jsonify({"message": 'non-existent user', "status": "error"}), 400 @@ -262,12 +263,16 @@ def user(username=None): 'spotify_linked': False }) + if 'lastfm_username' in request_json: + logger.info(f'updating lastfm username {username} -> {request_json["lastfm_username"]}') + dic['lastfm_username'] = request_json['lastfm_username'] + if len(dic) == 0: logger.warning(f'no updates for {request_json["username"]}') return jsonify({"message": 'no changes to make', "status": "error"}), 400 actionable_user.update(dic) - logger.info(f'updated {request_json["username"]}') + logger.info(f'updated {username}') return jsonify({'message': 'account updated', 'status': 'succeeded'}), 200 @@ -298,7 +303,7 @@ def users(username=None): @blueprint.route('/user/password', methods=['POST']) @login_required -def change_password(): +def change_password(username=None): request_json = request.get_json() @@ -310,17 +315,17 @@ def change_password(): if len(request_json['new_password']) > 30: return jsonify({"error": 'password too long'}), 400 - current_user = database.get_user_doc_ref(session['username']) + current_user = database.get_user_doc_ref(username) if check_password_hash(current_user.get().to_dict()['password'], request_json['current_password']): current_user.update({'password': generate_password_hash(request_json['new_password'])}) - logger.info(f'password udpated {session["username"]}') + logger.info(f'password udpated {username}') return jsonify({"message": 'password changed', "status": "success"}), 200 else: - logger.warning(f"incorrect password {session['username']}") + logger.warning(f"incorrect password {username}") return jsonify({'error': 'wrong password provided'}), 401 else: diff --git a/src/js/Maths/Maths.js b/src/js/Maths/Maths.js new file mode 100644 index 0000000..d9b6fe6 --- /dev/null +++ b/src/js/Maths/Maths.js @@ -0,0 +1,18 @@ +import React, { Component } from "react"; +import { BrowserRouter as Router, Route, Link, Switch, Redirect} from "react-router-dom"; + +class Maths extends Component { + + render() { + return ( +
+ + +
+ ); + } +} + + + +export default Maths; \ No newline at end of file diff --git a/src/js/PlaylistManager.js b/src/js/PlaylistManager.js index 00ff54b..993da8d 100644 --- a/src/js/PlaylistManager.js +++ b/src/js/PlaylistManager.js @@ -2,6 +2,7 @@ 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/PlaylistView.js"; import Settings from "./Settings/Settings.js"; @@ -57,8 +58,9 @@ class PlaylistManager extends Component { home playlists - settings - { this.state.type == 'admin' && admin } + maths + settings + { this.state.type == 'admin' && admin } logout sarsoo.xyz @@ -68,6 +70,7 @@ class PlaylistManager extends Component { + { this.state.type == 'admin' && } diff --git a/src/js/Settings/ChangePassword.js b/src/js/Settings/ChangePassword.js index a9e4d18..f72451b 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 showMessage from "../Toast.js" + class ChangePassword extends Component { constructor(props){ @@ -8,9 +10,7 @@ class ChangePassword extends Component { this.state = { current: "", new1: "", - new2: "", - error: false, - errorValue: null + new2: "" } this.handleCurrentChange = this.handleCurrentChange.bind(this); this.handleNewChange = this.handleNewChange.bind(this); @@ -37,37 +37,21 @@ class ChangePassword extends Component { handleSubmit(event){ if(this.state.current.length == 0){ - this.setState({ - error: true, - errorValue: "enter current password" - }); + showMessage("enter current password"); }else{ if(this.state.new1.length == 0){ - this.setState({ - error: true, - errorValue: "enter new password" - }); + showMessage("enter new password"); }else{ if(this.state.new1 != this.state.new2){ - this.setState({ - error: true, - errorValue: "new password mismatch" - }); + showMessage("new password mismatch"); }else{ - axios.post('/api/user/password',{ current_password: this.state.current, new_password: this.state.new1 }).then((response) => { - this.setState({ - error: true, - errorValue: "password changed" - }); + showMessage("password changed"); }).catch((error) => { - this.setState({ - error: true, - errorValue: "error changing password" - }); + showMessage(`error changing password (${error.response.status})`); }); } } diff --git a/src/js/Settings/LastFM.js b/src/js/Settings/LastFM.js new file mode 100644 index 0000000..88407dd --- /dev/null +++ b/src/js/Settings/LastFM.js @@ -0,0 +1,98 @@ +import React, { Component } from "react"; +const axios = require('axios'); + +import showMessage from "../Toast.js" + +class LastFM extends Component { + + constructor(props){ + super(props); + this.state = { + lastfm_username: null, + isLoading: true + } + this.getUserInfo(); + + this.handleChange = this.handleChange.bind(this); + this.handleSubmit = this.handleSubmit.bind(this); + } + + getUserInfo(){ + axios.get('/api/user') + .then((response) => { + + var username = response.data.lastfm_username; + + if(username == null){ + username = ''; + } + + this.setState({ + lastfm_username: username, + isLoading: false + }) + }) + .catch((error) => { + showMessage(`error getting user info (${error.response.status})`); + }); + } + + handleChange(event){ + this.setState({ + 'lastfm_username': event.target.value + }); + } + + handleSubmit(event){ + + var username = this.state.lastfm_username; + + if(username == ''){ + username = null + } + + axios.post('/api/user',{ + lastfm_username: username + }).then((response) => { + showMessage('saved'); + }).catch((error) => { + showMessage(`error saving (${error.response.status})`); + }); + + event.preventDefault(); + + } + + render(){ + const table = +
+ + + + + + + + + + + + + + + +

last.fm username

username:
+
; + + const loadingMessage =

loading...

; + + return this.state.isLoading ? loadingMessage : table; + } +} + +export default LastFM; \ No newline at end of file diff --git a/src/js/Settings/Settings.js b/src/js/Settings/Settings.js index dd7a99f..6f0438d 100644 --- a/src/js/Settings/Settings.js +++ b/src/js/Settings/Settings.js @@ -3,6 +3,7 @@ import { BrowserRouter as Router, Route, Link, Switch, Redirect} from "react-rou import ChangePassword from "./ChangePassword.js"; import SpotifyLink from "./SpotifyLink.js"; +import LastFM from "./LastFM.js"; class Settings extends Component { @@ -12,10 +13,12 @@ class Settings extends Component {
  • password
  • spotify
  • +
  • last.fm
+ );