From 12f3b45529341ee9d92be33a67c2f08822cf629a Mon Sep 17 00:00:00 2001 From: lukew3 Date: Wed, 26 May 2021 19:06:03 -0400 Subject: [PATCH] changed displayName to name, moved from cookies to localstorage --- backend/server.js | 11 ++++-- functions/index.js | 66 ++++++++++++++++----------------- functions/non-migrated.js | 6 +-- gulpfile.js | 3 +- package-lock.json | 11 ------ package.json | 1 - src/js/account-controller.js | 60 +++++++----------------------- src/js/account.js | 8 ++-- src/js/axios-instance.js | 12 ++---- src/js/cloud-functions.js | 2 +- src/js/db.js | 15 +------- src/js/elements/leaderboards.js | 14 +++---- 12 files changed, 73 insertions(+), 136 deletions(-) diff --git a/backend/server.js b/backend/server.js index 261160484..d90c21864 100644 --- a/backend/server.js +++ b/backend/server.js @@ -589,7 +589,7 @@ app.post("/api/signIn", (req, res) => { user.save(); const retUser = { uid: user._id, - displayName: user.name, + name: user.name, email: user.email, emailVerified: user.emailVerified, metadata: { creationTime: user.createdAt }, @@ -644,7 +644,7 @@ app.post("/api/signUp", (req, res) => { user.save(); const retUser = { uid: user._id, - displayName: user.name, + name: user.name, email: user.email, emailVerified: user.emailVerified, metadata: { creationTime: user.createdAt }, @@ -1405,6 +1405,7 @@ function addToLeaderboard(lb, result, username) { } } } + if (!retData.foundAt) retData.foundAt = 0; //determine if the entry should be hidden //add item to leaderboard @@ -1419,8 +1420,12 @@ function addToLeaderboard(lb, result, username) { timestamp: Date.now(), hidden: false, }; - if (lb.board.length == 0 || lbitem.wpm < lb.board.slice(-1)[0].wpm) { + if (lb.board.length == 0) { lb.board.push(lbitem); + retData.insertedAt = 1; + } else if (lbitem.wpm < lb.board.slice(-1)[0].wpm) { + lb.board.push(lbitem); + retData.insertedAt = lb.board.length + 1; } else { for (i = 0; i < lb.board.length; i++) { //start from top, if item wpm > lb item wpm, insert before it diff --git a/functions/index.js b/functions/index.js index ce9af1cae..010b5dbe9 100644 --- a/functions/index.js +++ b/functions/index.js @@ -18,43 +18,39 @@ const db = admin.firestore(); const auth = admin.auth(); const fetch = require("node-fetch"); -exports.changeDisplayName = functions.https.onCall( - async (request, response) => { - try { - if (!isUsernameValid(request.name)) - return { status: -1, message: "Name not valid" }; - let taken = await db - .collection("takenNames") - .doc(request.name.toLowerCase()) - .get(); - taken = taken.data(); - if (taken === undefined || taken.taken === false) { - //not taken - let oldname = admin.auth().getUser(request.uid); - oldname = (await oldname).displayName; - await admin - .auth() - .updateUser(request.uid, { displayName: request.name }); - await db - .collection("users") - .doc(request.uid) - .set({ name: request.name }, { merge: true }); - await db.collection("takenNames").doc(request.name.toLowerCase()).set( - { - taken: true, - }, - { merge: true } - ); - await db.collection("takenNames").doc(oldname.toLowerCase()).delete(); - return { status: 1, message: "Updated" }; - } else { - return { status: -2, message: "Name taken." }; - } - } catch (e) { - return { status: -999, message: "Error: " + e.message }; +exports.changename = functions.https.onCall(async (request, response) => { + try { + if (!isUsernameValid(request.name)) + return { status: -1, message: "Name not valid" }; + let taken = await db + .collection("takenNames") + .doc(request.name.toLowerCase()) + .get(); + taken = taken.data(); + if (taken === undefined || taken.taken === false) { + //not taken + let oldname = admin.auth().getUser(request.uid); + oldname = (await oldname).name; + await admin.auth().updateUser(request.uid, { name: request.name }); + await db + .collection("users") + .doc(request.uid) + .set({ name: request.name }, { merge: true }); + await db.collection("takenNames").doc(request.name.toLowerCase()).set( + { + taken: true, + }, + { merge: true } + ); + await db.collection("takenNames").doc(oldname.toLowerCase()).delete(); + return { status: 1, message: "Updated" }; + } else { + return { status: -2, message: "Name taken." }; } + } catch (e) { + return { status: -999, message: "Error: " + e.message }; } -); +}); exports.verifyUser = functions.https.onRequest(async (request, response) => { response.set("Access-Control-Allow-Origin", origin); diff --git a/functions/non-migrated.js b/functions/non-migrated.js index 7e483fab2..f4750a7e4 100644 --- a/functions/non-migrated.js +++ b/functions/non-migrated.js @@ -123,7 +123,7 @@ async function getAllNames() { // .then((data) => { // let names = []; // data.users.forEach((user) => { - // names.push(user.displayName); + // names.push(user.name); // }); // return names; // }); @@ -134,7 +134,7 @@ async function getAllNames() { // List batch of users, 1000 at a time. let listUsersResult = await admin.auth().listUsers(1000, nextPageToken); for (let i = 0; i < listUsersResult.users.length; i++) { - ret.push(listUsersResult.users[i].displayName); + ret.push(listUsersResult.users[i].name); } if (listUsersResult.pageToken) { // List next batch of users. @@ -153,7 +153,7 @@ async function getAllUsers() { // .then((data) => { // let names = []; // data.users.forEach((user) => { - // names.push(user.displayName); + // names.push(user.name); // }); // return names; // }); diff --git a/gulpfile.js b/gulpfile.js index d2ae8726d..826baa131 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,7 +1,6 @@ const { task, src, dest, series, watch } = require("gulp"); const browserify = require("browserify"); const axios = require("axios"); -const Cookies = require("js-cookie"); const babelify = require("babelify"); const concat = require("gulp-concat"); const del = require("del"); @@ -14,7 +13,7 @@ sass.compiler = require("dart-sass"); let eslintConfig = { parser: "babel-eslint", - globals: ["jQuery", "$", "Cookies", "moment", "html2canvas", "ClipboardItem"], + globals: ["jQuery", "$", "moment", "html2canvas", "ClipboardItem"], envs: ["es6", "browser", "node"], rules: { "constructor-super": "error", diff --git a/package-lock.json b/package-lock.json index 72ba0931a..d9d45ce4d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,6 @@ "chartjs-plugin-trendline": "^0.2.2", "dotenv": "^9.0.2", "express": "^4.17.1", - "js-cookie": "^2.2.1", "jsonwebtoken": "^8.5.1", "mongoose": "^5.12.8", "tinycolor2": "^1.4.2" @@ -7641,11 +7640,6 @@ "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", "dev": true }, - "node_modules/js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -19481,11 +19475,6 @@ "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", "dev": true }, - "js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", diff --git a/package.json b/package.json index b1c6aca33..cea4860dc 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,6 @@ "chartjs-plugin-trendline": "^0.2.2", "dotenv": "^9.0.2", "express": "^4.17.1", - "js-cookie": "^2.2.1", "jsonwebtoken": "^8.5.1", "mongoose": "^5.12.8", "tinycolor2": "^1.4.2" diff --git a/src/js/account-controller.js b/src/js/account-controller.js index be0f8e344..79fc429e5 100644 --- a/src/js/account-controller.js +++ b/src/js/account-controller.js @@ -13,7 +13,6 @@ import * as AllTimeStats from "./all-time-stats"; import * as DB from "./db"; import * as TestLogic from "./test-logic"; import * as UI from "./ui"; -import Cookies from "js-cookie"; import axiosInstance from "./axios-instance"; //var gmailProvider = new firebase.auth.GoogleAuthProvider(); @@ -30,38 +29,14 @@ export function signIn() { // UI.changePage("test"); if ($(".pageLogin .login #rememberMe input").prop("checked")) { // TODO: set user login cookie that persists after session - Cookies.set("accessToken", response.data.accessToken, { expires: 1 }); - Cookies.set("refreshToken", response.data.refreshToken, { - expires: 100000, - }); - Cookies.set("uid", response.data.user._id, { expires: 100000 }); - Cookies.set("displayName", response.data.user.name, { - expires: 100000, - }); - Cookies.set("email", response.data.user.email, { expires: 100000 }); - Cookies.set("emailVerified", response.data.user.emailVerified, { - expires: 100000, - }); - Cookies.set("creationTime", response.data.user.metadata.creationTime, { - expires: 100000, - }); + window.localStorage.setItem("accessToken", response.data.accessToken); + window.localStorage.setItem("refreshToken", response.data.refreshToken); + window.localStorage.setItem("user", JSON.stringify(response.data.user)); } else { //set user login cookie to persist only as long as the session lives - Cookies.set("accessToken", response.data.accessToken, { expires: 1 }); - Cookies.set("refreshToken", response.data.refreshToken, { - expires: 100000, - }); - Cookies.set("uid", response.data.user._id, { expires: 100000 }); - Cookies.set("displayName", response.data.user.name, { - expires: 100000, - }); - Cookies.set("email", response.data.user.email, { expires: 100000 }); - Cookies.set("emailVerified", response.data.user.emailVerified, { - expires: 100000, - }); - Cookies.set("creationTime", response.data.user.metadata.creationTime, { - expires: 100000, - }); + window.localStorage.setItem("accessToken", response.data.accessToken); + window.localStorage.setItem("refreshToken", response.data.refreshToken); + window.localStorage.setItem("user", JSON.stringify(response.data.user)); } userStateChanged(response.data.user); }) @@ -126,10 +101,9 @@ export function linkWithGoogle() { export function signOut() { //don't think I need an axios request here if I'm using jwt - Cookies.remove("accessToken"); - Cookies.remove("uid"); - Cookies.remove("displayName"); - Cookies.remove("email"); + window.localStorage.removeItem("accessToken"); + window.localStorage.removeItem("refreshToken"); + window.localStorage.removeItem("user"); Notifications.add("Signed out", 0, 2); AllTimeStats.clear(); Settings.hideAccountSection(); @@ -162,17 +136,9 @@ function signUp() { }) .then((response) => { let usr = response.data.user; - Cookies.set("accessToken", response.data.accessToken, { expires: 1 }); - Cookies.set("refreshToken", response.data.refreshToken, { - expires: 100000, - }); - Cookies.set("uid", usr._id, { expires: 100000 }); - Cookies.set("displayName", usr.name, { expires: 100000 }); - Cookies.set("email", usr.email, { expires: 100000 }); - Cookies.set("emailVerified", usr.emailVerified, { expires: 100000 }); - Cookies.set("creationTime", response.data.user.metadata.creationTime, { - expires: 100000, - }); + window.localStorage.setItem("accessToken", response.data.accessToken); + window.localStorage.setItem("refreshToken", response.data.refreshToken); + window.localStorage.setItem("user", JSON.stringify(response.data.user)); //Cookies.set('refreshToken', response.data.refreshToken); AllTimeStats.clear(); Notifications.add("Account created", 1, 3); @@ -258,7 +224,7 @@ export function userStateChanged(user) { AccountButton.update(); AccountButton.loading(true); Account.getDataAndInit(); - // var displayName = user.displayName; + // var name = user.name; // var email = user.email; // var emailVerified = user.emailVerified; // var photoURL = user.photoURL; diff --git a/src/js/account.js b/src/js/account.js index dc342648b..e21d6808b 100644 --- a/src/js/account.js +++ b/src/js/account.js @@ -30,11 +30,11 @@ export function getDataAndInit() { let user = DB.currentUser(); // I think that this should be stored in cookie if (snap.name === undefined) { //verify username - if (Misc.isUsernameValid(user.displayName)) { + if (Misc.isUsernameValid(user.name)) { //valid, just update - snap.name = user.displayName; + snap.name = user.name; DB.setSnapshot(snap); - DB.updateName(user.uid, user.displayName); + DB.updateName(user.uid, user.name); } else { //invalid, get new // Notifications.add("Invalid name", 0); @@ -49,7 +49,7 @@ export function getDataAndInit() { promptVal = prompt( "Your name is either invalid or unavailable (you also need to do this if you used Google Sign Up). Please provide a new display name (cannot be longer than 14 characters, can only contain letters, numbers, underscores, dots and dashes):" ); - cdnVal = await CloudFunctions.changeDisplayName({ + cdnVal = await CloudFunctions.changename({ uid: user.uid, name: promptVal, }); diff --git a/src/js/axios-instance.js b/src/js/axios-instance.js index c81435463..a8ae396b8 100644 --- a/src/js/axios-instance.js +++ b/src/js/axios-instance.js @@ -1,4 +1,3 @@ -import Cookies from "js-cookie"; import axios from "axios"; const axiosInstance = axios.create(); @@ -6,9 +5,7 @@ const axiosInstance = axios.create(); // Request interceptor for API calls axiosInstance.interceptors.request.use( async (config) => { - const accessToken = Cookies.get("accessToken") - ? Cookies.get("accessToken") - : null; + const accessToken = window.localStorage.getItem("accessToken"); if (accessToken) { config.headers = { Authorization: `Bearer ${accessToken}`, @@ -37,10 +34,7 @@ axiosInstance.interceptors.response.use( const originalRequest = error.config; if (error.response.status === 401 && !originalRequest._retry) { originalRequest._retry = true; - //console.log("Refreshing access token"); - const refreshToken = Cookies.get("refreshToken") - ? Cookies.get("refreshToken") - : null; + const refreshToken = window.localStorage.getItem("refreshToken"); await axios .post( `/api/refreshToken`, @@ -48,7 +42,7 @@ axiosInstance.interceptors.response.use( { headers: { Authorization: `Bearer ${refreshToken}` } } ) .then((response) => { - Cookies.set("accessToken", response.data.accessToken); + window.localStorage.setItem("accessToken", response.data.accessToken); axios.defaults.headers.common["Authorization"] = "Bearer " + response.data.accessToken; }) diff --git a/src/js/cloud-functions.js b/src/js/cloud-functions.js index 7677c08dd..3d4b9d6b1 100644 --- a/src/js/cloud-functions.js +++ b/src/js/cloud-functions.js @@ -58,7 +58,7 @@ export function getLeaderboard(input) { export function clearTagPb(input) { console.log("request data here"); } -export function changeDisplayName(input) { +export function changename(input) { console.log("request data here"); } diff --git a/src/js/db.js b/src/js/db.js index a0726cfb9..d61a5220c 100644 --- a/src/js/db.js +++ b/src/js/db.js @@ -2,7 +2,6 @@ import { loadTags } from "./result-filters"; import * as AccountButton from "./account-button"; import * as Notifications from "./notifications"; import axiosInstance from "./axios-instance"; -import Cookies from "js-cookie"; let dbSnapshot = null; @@ -29,19 +28,9 @@ export function setSnapshot(newSnapshot) { } export function currentUser() { - const token = Cookies.get("accessToken"); + const token = window.localStorage.getItem("accessToken"); if (token) { - //maybe user object could be stored in localStorage - // I think tokens should continue to stay in cookies though - const user = { - uid: Cookies.get("uid"), - displayName: Cookies.get("displayName"), - email: Cookies.get("email"), - metadata: { - creationTime: Cookies.get("creationTime"), - }, - emailVerified: Cookies.get("emailVerified"), - }; + const user = JSON.parse(window.localStorage.getItem("user")); return user; } else { return null; diff --git a/src/js/elements/leaderboards.js b/src/js/elements/leaderboards.js index 42353ba52..05a87251c 100644 --- a/src/js/elements/leaderboards.js +++ b/src/js/elements/leaderboards.js @@ -29,11 +29,6 @@ function update() { let boardinfo = currentLeaderboard.split("_"); - let uid = null; - if (DB.currentUser() !== null) { - uid = DB.currentUser().uid; - } - Loader.show(); Promise.all([ axiosInstance.get( @@ -87,7 +82,7 @@ function update() { dailyData.board.forEach((entry) => { if (entry.hidden) return; let meClassString = ""; - if (entry.name == DB.currentUser().displayName) { + if (entry.name == DB.currentUser().name) { meClassString = ' class="me"'; $("#leaderboardsWrapper table.daily tfoot").html(` @@ -170,7 +165,12 @@ function update() { globalData.board.forEach((entry) => { if (entry.hidden) return; let meClassString = ""; - if (entry.name == DB.currentUser().displayName) { + console.log("Should be setting my leaderboard"); + console.log(entry.name); + console.log(DB.currentUser()); + console.log(DB.currentUser().name); + if (entry.name == DB.currentUser().name) { + console.log("Setting my leaderboard now"); meClassString = ' class="me"'; $("#leaderboardsWrapper table.global tfoot").html(`