- {/* Coderoom | Coding Ninjas */}
- {/* */}
- {/* */}
Share Code within Realtime .
diff --git a/src/containers/pages/Login.js b/src/containers/pages/Login.js
index 5b50a3a..0b635dd 100644
--- a/src/containers/pages/Login.js
+++ b/src/containers/pages/Login.js
@@ -1,11 +1,9 @@
import React from "react";
-import random from "random-key";
import logo from '../../images/CNLOGO.svg';
import { Helmet } from 'react-helmet';
import { FontIcon, RaisedButton } from "material-ui";
import { loginWithGoogle } from "../../helpers/auth";
import { firebaseAuth } from "../../config/firebase-config";
-import { database } from "firebase/app";
const firebaseAuthKey = "firebaseAuthInProgress";
const appTokenKey = "appToken";
@@ -19,7 +17,6 @@ export default class Login extends React.Component {
this.state = {
splashScreen: false,
- key: random.generate(3), // for storing connected-users
};
this.handleGoogleLogin = this.handleGoogleLogin.bind(this);
@@ -61,52 +58,9 @@ export default class Login extends React.Component {
firebaseAuth().onAuthStateChanged(user => {
try {
if (user) {
-
- if (localStorage.getItem(sessionID)) {
- const session_id = localStorage.getItem(sessionID);
-
- var newUser;
-
- // checking if user already present in database
- database()
- .ref(`code-sessions/${session_id}/users-connected`)
- .on("value", function(snapshot){
- snapshot.forEach(function(childSnapshot){
- var userData = childSnapshot.val();
- if(userData.user_id === user.uid){
- newUser = false;
- // console.log("User already connected previously.");
- }
- });
- if(newUser !== false){
- newUser = true;
- }
- })
-
- function firebaseDelay(key) {
-
- // adding new user details in database
- if(newUser === true){
- // console.log("User connected to the session.");
- database()
- .ref(`code-sessions/${session_id}/users-connected/user-` + key)
- .set({
- user_id: user.uid,
- user_name: user.displayName,
- user_email: user.email,
- user_photo: user.photoURL
- });
- }
-
- }
-
- // wait 4 seconds to complete fetching and storing data in database
- setTimeout(firebaseDelay, 4000, this.state.key);
-
- }
// console.log("User signed in: ", JSON.stringify(user));
- console.log("\n User signed in:", user);
+ console.log("User signed in:", user);
localStorage.removeItem(firebaseAuthKey);
@@ -127,7 +81,7 @@ export default class Login extends React.Component {
}
} catch(error) {
- console.log("Error in authentication.");
+ console.log("Error in authentication:", error);
}
});
}
From 9fb332d6bebbb98446d711a2460ac921fa6332d7 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Wed, 25 Mar 2020 14:13:10 +0530
Subject: [PATCH 09/51] fix updation of users in sidebar
---
.firebase/hosting.YnVpbGQ.cache | 34 +++++++-------
src/components/SideDrawer/SideDrawer.css | 3 +-
src/components/SideDrawer/SideDrawer.js | 59 ++++++++++++------------
src/containers/pages/Coding.js | 22 +++++++--
4 files changed, 67 insertions(+), 51 deletions(-)
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
index a7339c9..29806aa 100644
--- a/.firebase/hosting.YnVpbGQ.cache
+++ b/.firebase/hosting.YnVpbGQ.cache
@@ -1,17 +1,17 @@
-asset-manifest.json,1584800148689,3c390db6c8a227fce40f5911ca8159856ec7957a0b756459358dcf0c6ab42ef6
-index.html,1584800148687,b5c9b56572ee34a1070458bf28513d87f2f9ee0ab0d28329a040646014a67d13
-precache-manifest.658036258ed822e28f055367bb14f8fd.js,1584800148688,4841c761c1f01d1a6420ff2db650d5befef00e5739da5f76d51b2f8ce85befe5
-service-worker.js,1584800148687,5622fc8ec1da372b75d028364b528fa2f78caac9acfe5d81d0750131efaa7d31
-static/css/main.ac8e5b7d.chunk.css,1584800148698,77748b0be7a3ef610424575d43c7781d9af95f4c0a7e0268b6d97b23cfb1b87b
-static/css/2.fba55a0b.chunk.css,1584800148747,924c60cbb1fca274040a2a2c55942950e947e8e61f69e8802b30d3476d8eacff
-static/js/2.1092463d.chunk.js.LICENSE.txt,1584800148746,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-static/css/main.ac8e5b7d.chunk.css.map,1584800148747,3dd4e3a4f1f11e81598ebf7b8ad49003bd793a6733929fae1e74fe519b7fb772
-static/css/2.fba55a0b.chunk.css.map,1584800148747,aef0708a2c016b136c003417e6a3741e4d99065ef70d706b0c67b676c5b1ae2f
-static/js/main.708cacd0.chunk.js,1584800148746,ecdc26c1e4434eec9334c7c14c76f983d822cb6cbc9a7dab7edcbb8feae50b57
-static/js/runtime-main.e13d1eff.js,1584800148746,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-static/js/runtime-main.e13d1eff.js.map,1584800148747,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/media/CNLOGO.c149ff8b.svg,1584800148689,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-static/js/main.708cacd0.chunk.js.map,1584800148746,0c587448718fd5f40bf354d429a91cd162af92cabbd3ad912d25c79abd98139c
-favicon_CN.ico,1584800133631,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/js/2.1092463d.chunk.js,1584800148747,9b77d59c7aa04b444416c2fb7af3744410862e33f9b2609f3078a2fba9e5c11c
-static/js/2.1092463d.chunk.js.map,1584800148749,d30d2d84a5747596b2f2fe615b580398a8e11e5a7ea5e6e480aaf7a1d3d59a8a
+asset-manifest.json,1584971051191,80eeeda2090c69bbf450abeb37f8cf5f477b86c39e6f207389099ec1464ad60d
+index.html,1584971051154,b4dec78eefbc23b002a5fe1660eeaf596a48d38b83ed3185ee33692f2d6cc6d0
+precache-manifest.0f6a64e334cc7fb849b4b252fd9c7001.js,1584971051155,c0704306a80b568b6cfaec498865ed121569bda685345a4b39e7fc7ea4a3d9c4
+service-worker.js,1584971051155,d8985c7d5356649d1ec3d34819aa46caa3c55de0bdd6576d5c0979c1649be493
+static/css/2.fba55a0b.chunk.css,1584971051191,924c60cbb1fca274040a2a2c55942950e947e8e61f69e8802b30d3476d8eacff
+static/css/main.f61cd6bf.chunk.css,1584971051191,c68d59c675ad4c951babaf805cda6b85c66517ad289b4ea02b8d86aa0920dc9d
+static/css/2.fba55a0b.chunk.css.map,1584971051192,aef0708a2c016b136c003417e6a3741e4d99065ef70d706b0c67b676c5b1ae2f
+static/css/main.f61cd6bf.chunk.css.map,1584971051193,96e56969a297705eb3eb969134daff4baf4914c5200ca6c22365875eeee43b8b
+static/js/runtime-main.e13d1eff.js,1584971051191,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
+static/js/main.ef47ce02.chunk.js,1584971051158,079e5cb7aac0cfdf50a94e58c6d54d1dddfebad57feeb52f547816e6fc278276
+static/js/runtime-main.e13d1eff.js.map,1584971051192,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
+static/js/2.e1476445.chunk.js.LICENSE.txt,1584971051191,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
+static/media/CNLOGO.c149ff8b.svg,1584971051191,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
+favicon_CN.ico,1584971023357,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
+static/js/main.ef47ce02.chunk.js.map,1584971051193,6ba9df70c41aecc619d67018ce3d7926ee92f957762f430272d7c2bacdbfbe09
+static/js/2.e1476445.chunk.js,1584971051193,3b19e38fad74942f3aac6270abfbc629774581b15469d0de6276fb93d540df02
+static/js/2.e1476445.chunk.js.map,1584971051192,b7f1b221d32b2887fbe46ecdf077674ee2f4bacc2272af550aa331d24be428a1
diff --git a/src/components/SideDrawer/SideDrawer.css b/src/components/SideDrawer/SideDrawer.css
index aa32568..bc73ad0 100644
--- a/src/components/SideDrawer/SideDrawer.css
+++ b/src/components/SideDrawer/SideDrawer.css
@@ -12,6 +12,7 @@
/* transform: translateX(-100%); */
transform: translateX(100%);
transition: transform 0.3s ease-out;
+ overflow: auto;
}
.side-drawer.open {
@@ -67,7 +68,7 @@
.side-drawer ul {
margin: 0;
padding: 0 40px;
- height: 100%;
+ height: 75%;
list-style: none;
display: flex;
flex-direction: column;
diff --git a/src/components/SideDrawer/SideDrawer.js b/src/components/SideDrawer/SideDrawer.js
index 0452f99..67dffb7 100644
--- a/src/components/SideDrawer/SideDrawer.js
+++ b/src/components/SideDrawer/SideDrawer.js
@@ -1,37 +1,38 @@
import React from 'react';
-
import './SideDrawer.css';
-import { usersList } from '../../containers/pages/Coding';
import { creatorInfo } from '../../containers/pages/Coding';
+import { usersList } from '../../containers/pages/Coding';
-const sideDrawer = props => {
+export default class sideDrawer extends React.Component {
- let drawerClasses = 'side-drawer';
+ render() {
+
+ let drawerClasses = 'side-drawer';
- if (props.show) {
- drawerClasses = 'side-drawer open';
+ if (this.props.show) {
+ drawerClasses = 'side-drawer open';
+ }
+
+ return (
+
+
+ Session Creator:
+
+
+
+
+
{creatorInfo.user_name}
+
+
+
+ Connected Users:
+
+
+
+
+ );
}
-
- return (
-
-
- Session Creator:
-
-
-
-
-
{creatorInfo.user_name}
-
-
-
- Connected Users:
-
-
-
-
- );
-};
-export default sideDrawer;
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index 1682f33..022a190 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -67,6 +67,9 @@ export default class CodingPage extends React.Component {
.then(snapshot => {
var readOnly = snapshot.val().readOnly;
this.setState({ readOnly: readOnly });
+ })
+ .catch(e => {
+ // no session found corresponding to "sessionid" passed in the params
});
this.handleLogout = this.handleLogout.bind(this);
@@ -106,8 +109,16 @@ export default class CodingPage extends React.Component {
creatorInfo.user_name = creatorData.user_name;
creatorInfo.user_photo = creatorData.user_photo;
// console.log(creatorData);
+ })
+ .catch(e => {
+ // no session found corresponding to "sessionid" passed in the params
});
+ if (creator_uid === undefined ){
+ console.log("No Session Found!");
+ return;
+ }
+
// do not add user details to 'users-connected'
// if that user is the creator of session
if (user.uid !== creator_uid){
@@ -132,6 +143,9 @@ export default class CodingPage extends React.Component {
if(newUser !== false){
newUser = true;
}
+ })
+ .catch(e => {
+ console.log(e);
});
// adding new user details in database
@@ -156,9 +170,9 @@ export default class CodingPage extends React.Component {
// displaying users-connected from database
database()
.ref(`code-sessions/${params.sessionid}/users-connected`)
- .once("value")
- .then(snapshot => {
+ .on('value', snapshot => {
console.log("\nConnected users: ");
+ usersList.splice(0, usersList.length);
var i = 0;
snapshot.forEach(function(childSnapshot){
var userData = childSnapshot.val();
@@ -279,7 +293,7 @@ export default class CodingPage extends React.Component {
}, () => this.codemirror.focus());
// updating readOnly in database
this.codeRef.child("readOnly").set(!this.state.readOnly);
- }
+ };
render() {
@@ -322,7 +336,7 @@ export default class CodingPage extends React.Component {
}
/>
-
+
{ backdrop }
From a72a0f44f9ff2b473098997dceb138513dafe85c Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Wed, 25 Mar 2020 22:02:31 +0530
Subject: [PATCH 10/51] display users-connected editing state in Header
---
.firebase/hosting.YnVpbGQ.cache | 34 ++++++++++++++++-----------------
src/containers/pages/Coding.js | 32 +++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+), 17 deletions(-)
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
index 29806aa..8271a27 100644
--- a/.firebase/hosting.YnVpbGQ.cache
+++ b/.firebase/hosting.YnVpbGQ.cache
@@ -1,17 +1,17 @@
-asset-manifest.json,1584971051191,80eeeda2090c69bbf450abeb37f8cf5f477b86c39e6f207389099ec1464ad60d
-index.html,1584971051154,b4dec78eefbc23b002a5fe1660eeaf596a48d38b83ed3185ee33692f2d6cc6d0
-precache-manifest.0f6a64e334cc7fb849b4b252fd9c7001.js,1584971051155,c0704306a80b568b6cfaec498865ed121569bda685345a4b39e7fc7ea4a3d9c4
-service-worker.js,1584971051155,d8985c7d5356649d1ec3d34819aa46caa3c55de0bdd6576d5c0979c1649be493
-static/css/2.fba55a0b.chunk.css,1584971051191,924c60cbb1fca274040a2a2c55942950e947e8e61f69e8802b30d3476d8eacff
-static/css/main.f61cd6bf.chunk.css,1584971051191,c68d59c675ad4c951babaf805cda6b85c66517ad289b4ea02b8d86aa0920dc9d
-static/css/2.fba55a0b.chunk.css.map,1584971051192,aef0708a2c016b136c003417e6a3741e4d99065ef70d706b0c67b676c5b1ae2f
-static/css/main.f61cd6bf.chunk.css.map,1584971051193,96e56969a297705eb3eb969134daff4baf4914c5200ca6c22365875eeee43b8b
-static/js/runtime-main.e13d1eff.js,1584971051191,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-static/js/main.ef47ce02.chunk.js,1584971051158,079e5cb7aac0cfdf50a94e58c6d54d1dddfebad57feeb52f547816e6fc278276
-static/js/runtime-main.e13d1eff.js.map,1584971051192,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/js/2.e1476445.chunk.js.LICENSE.txt,1584971051191,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-static/media/CNLOGO.c149ff8b.svg,1584971051191,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-favicon_CN.ico,1584971023357,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/js/main.ef47ce02.chunk.js.map,1584971051193,6ba9df70c41aecc619d67018ce3d7926ee92f957762f430272d7c2bacdbfbe09
-static/js/2.e1476445.chunk.js,1584971051193,3b19e38fad74942f3aac6270abfbc629774581b15469d0de6276fb93d540df02
-static/js/2.e1476445.chunk.js.map,1584971051192,b7f1b221d32b2887fbe46ecdf077674ee2f4bacc2272af550aa331d24be428a1
+asset-manifest.json,1585125876364,a2006b82318c4520aba7faa4e20cd45bd9d9c8ad0ab7afd5f05cce1285ec20bc
+index.html,1585125876361,a9727d9ff7f8101061b0134fc3e29a8203b54470dc6813d3240656fc1cf382cb
+precache-manifest.99de4e4e44d99e512b966859e8cf54c1.js,1585125876361,3f4b6e2619e4240d88425144cf5a468d3ca0f44d28726af9094253a24c881b8a
+service-worker.js,1585125876361,05b14f9ee6e0af12de4d68d74def4d74b8c1505dab2b658d5993af288556a9ea
+static/css/main.b4797ab2.chunk.css,1585125876364,0fb4914c15442a002dd44ce987468b8a10a96b37a635bb61167a5a49869fb0b6
+static/css/2.fba55a0b.chunk.css,1585125876399,924c60cbb1fca274040a2a2c55942950e947e8e61f69e8802b30d3476d8eacff
+static/js/2.8d6ae9be.chunk.js.LICENSE.txt,1585125876400,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
+static/css/main.b4797ab2.chunk.css.map,1585125876401,fae17d3e512e120d19547c794effe3a7e357c8f42ecb6ed91dc4bc08039a8ce4
+static/js/runtime-main.e13d1eff.js,1585125876401,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
+static/js/main.6d776981.chunk.js,1585125876399,db28d9f70b9b84620f8759eaad5521f967e6bf07f3614be4a3aacd19ea8f9c66
+static/css/2.fba55a0b.chunk.css.map,1585125876401,aef0708a2c016b136c003417e6a3741e4d99065ef70d706b0c67b676c5b1ae2f
+static/js/runtime-main.e13d1eff.js.map,1585125876401,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
+static/js/main.6d776981.chunk.js.map,1585125876400,2407f2afec6384f3fb2fd7b37d8595ae40b8bce75e3f86ee89da8d628a5a483c
+static/media/CNLOGO.c149ff8b.svg,1585125876362,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
+favicon_CN.ico,1585125847894,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
+static/js/2.8d6ae9be.chunk.js,1585125876400,753dd985caa2087c96e853a5f6f6c69d2c5a4a296abf0a40f40e1864a54d36aa
+static/js/2.8d6ae9be.chunk.js.map,1585125876401,8943ed6496dde6be9563fae9d3ac861327d9010c264a06b977c3d3c67893bef9
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index 022a190..69048bd 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -188,6 +188,21 @@ export default class CodingPage extends React.Component {
console.log("\n");
});
+ // making the users-editing-state button dynamic
+ database()
+ .ref(`code-sessions/${params.sessionid}`)
+ .on('value', snapshot => {
+ // console.log("readOnly changed!");
+ if(this.userEditingToggleBtn !== null){
+ let readOnlyState = snapshot.val().readOnly;
+ if(readOnlyState){
+ this.userEditingToggleBtn.innerHTML = "Editing: Disabled";
+ } else {
+ this.userEditingToggleBtn.innerHTML = "Editing: Enabled";
+ }
+ }
+ });
+
} else {
console.log("Cannot fetch currently signed-in user!");
}
@@ -315,6 +330,22 @@ export default class CodingPage extends React.Component {
}
+ // this button is only displayed to the users-connected (not the creator)
+ let userEditingToggle;
+ if (!this.state.isCreator) {
+ userEditingToggle =
+
{
+ this.userEditingToggleBtn = button;
+ }}
+ className="btn-coding margin-l-10"
+ onClick={null}>
+ {this.state.readOnly
+ ? 'Editing: Disabled'
+ : 'Editing: Enabled'}
+
+ }
+
return (
@@ -326,6 +357,7 @@ export default class CodingPage extends React.Component {
? `Created On: ${this.state.createdon}`
: ""}
{ readOnlyToggle }
+ { userEditingToggle }
Sign Out
From 6f68f53d2d76276410220d97d09c6a7113fce652 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Wed, 25 Mar 2020 23:14:38 +0530
Subject: [PATCH 11/51] change user-editing-state button styling
---
.firebase/hosting.YnVpbGQ.cache | 34 ++++++++++++++++-----------------
src/containers/App.css | 26 +++++++++++++++++++++++++
src/containers/pages/Coding.js | 2 +-
3 files changed, 44 insertions(+), 18 deletions(-)
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
index 8271a27..aa66729 100644
--- a/.firebase/hosting.YnVpbGQ.cache
+++ b/.firebase/hosting.YnVpbGQ.cache
@@ -1,17 +1,17 @@
-asset-manifest.json,1585125876364,a2006b82318c4520aba7faa4e20cd45bd9d9c8ad0ab7afd5f05cce1285ec20bc
-index.html,1585125876361,a9727d9ff7f8101061b0134fc3e29a8203b54470dc6813d3240656fc1cf382cb
-precache-manifest.99de4e4e44d99e512b966859e8cf54c1.js,1585125876361,3f4b6e2619e4240d88425144cf5a468d3ca0f44d28726af9094253a24c881b8a
-service-worker.js,1585125876361,05b14f9ee6e0af12de4d68d74def4d74b8c1505dab2b658d5993af288556a9ea
-static/css/main.b4797ab2.chunk.css,1585125876364,0fb4914c15442a002dd44ce987468b8a10a96b37a635bb61167a5a49869fb0b6
-static/css/2.fba55a0b.chunk.css,1585125876399,924c60cbb1fca274040a2a2c55942950e947e8e61f69e8802b30d3476d8eacff
-static/js/2.8d6ae9be.chunk.js.LICENSE.txt,1585125876400,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-static/css/main.b4797ab2.chunk.css.map,1585125876401,fae17d3e512e120d19547c794effe3a7e357c8f42ecb6ed91dc4bc08039a8ce4
-static/js/runtime-main.e13d1eff.js,1585125876401,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-static/js/main.6d776981.chunk.js,1585125876399,db28d9f70b9b84620f8759eaad5521f967e6bf07f3614be4a3aacd19ea8f9c66
-static/css/2.fba55a0b.chunk.css.map,1585125876401,aef0708a2c016b136c003417e6a3741e4d99065ef70d706b0c67b676c5b1ae2f
-static/js/runtime-main.e13d1eff.js.map,1585125876401,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/js/main.6d776981.chunk.js.map,1585125876400,2407f2afec6384f3fb2fd7b37d8595ae40b8bce75e3f86ee89da8d628a5a483c
-static/media/CNLOGO.c149ff8b.svg,1585125876362,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-favicon_CN.ico,1585125847894,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/js/2.8d6ae9be.chunk.js,1585125876400,753dd985caa2087c96e853a5f6f6c69d2c5a4a296abf0a40f40e1864a54d36aa
-static/js/2.8d6ae9be.chunk.js.map,1585125876401,8943ed6496dde6be9563fae9d3ac861327d9010c264a06b977c3d3c67893bef9
+asset-manifest.json,1585154135902,d2d37d7ee414a3369bff206820de947126f0460e20e27fc62948d8e893d0ae41
+index.html,1585154135899,7a0f2880679069cd485bb54def48f40d58ffece3e3f37b0b72453a5f2c60c3d7
+service-worker.js,1585154135899,9d26e4afdf826a4a6b162aaaee87a7364cf7305bdfb56d6b2c7f5d1ad7df097e
+precache-manifest.6f588a45097c27fd5c62a5615f39ec9c.js,1585154135899,38d23e59399103d554ba8e77c7d8abe01e9a8533e033273ea1ff11442f80ca8b
+static/css/2.fba55a0b.chunk.css,1585154135940,924c60cbb1fca274040a2a2c55942950e947e8e61f69e8802b30d3476d8eacff
+static/css/main.b4797ab2.chunk.css,1585154135941,0fb4914c15442a002dd44ce987468b8a10a96b37a635bb61167a5a49869fb0b6
+static/js/2.cad09d5d.chunk.js.LICENSE.txt,1585154135941,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
+static/css/main.b4797ab2.chunk.css.map,1585154135943,fae17d3e512e120d19547c794effe3a7e357c8f42ecb6ed91dc4bc08039a8ce4
+static/css/2.fba55a0b.chunk.css.map,1585154135941,aef0708a2c016b136c003417e6a3741e4d99065ef70d706b0c67b676c5b1ae2f
+static/js/main.0e96c271.chunk.js,1585154135940,fea4931b930ac69df06fd2488138b7730900674c4469fc073ed4f2230cf030e5
+favicon_CN.ico,1585154104360,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
+static/js/runtime-main.e13d1eff.js,1585154135941,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
+static/js/runtime-main.e13d1eff.js.map,1585154135941,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
+static/media/CNLOGO.c149ff8b.svg,1585154135900,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
+static/js/main.0e96c271.chunk.js.map,1585154135941,7f4fa638656b502083343d3503f18fc035a2330c639ec24c6017da6aa4bff189
+static/js/2.cad09d5d.chunk.js,1585154135941,3fe8e21c2e026bc3bd71864a26e07fba6973a21565ed5d8bdf2ed62c5883459e
+static/js/2.cad09d5d.chunk.js.map,1585154135943,92fa1c03adf5416dd4ee4fe18b823e80d357f50384ca5f771f69dbe940703c2a
diff --git a/src/containers/App.css b/src/containers/App.css
index d5e2295..5437ec2 100644
--- a/src/containers/App.css
+++ b/src/containers/App.css
@@ -134,6 +134,32 @@ p {
outline: none;
}
+.btn-user-editing {
+ display: inline-block;
+ margin-bottom: 0;
+ font-weight: 500;
+ text-align: center;
+ cursor: pointer;
+ border: 1px solid transparent;
+ line-height: 36px;
+ padding: 0 10px;
+ font-size: 14px;
+ border-radius: 58px;
+ text-decoration: none;
+ height: 36px;
+ background: transparent;
+ color: #e4e4e4;
+ border-color: #5ce198;
+ cursor: default;
+ -webkit-transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
+ -o-transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
+ transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
+}
+
+.btn-user-editing:focus {
+ outline: none;
+}
+
/**** Google Login Page ****/
.header-loginPage {
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index 69048bd..0a390cd 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -338,7 +338,7 @@ export default class CodingPage extends React.Component {
ref={button => {
this.userEditingToggleBtn = button;
}}
- className="btn-coding margin-l-10"
+ className="btn-user-editing margin-l-10"
onClick={null}>
{this.state.readOnly
? 'Editing: Disabled'
From 243111cbdddb4576af88e4b6da10b728bfce0833 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Wed, 25 Mar 2020 23:50:37 +0530
Subject: [PATCH 12/51] improve toggle button styling
---
.firebase/hosting.YnVpbGQ.cache | 34 ++++++++++++++++-----------------
src/containers/App.css | 5 +++++
src/containers/pages/Coding.js | 2 +-
3 files changed, 23 insertions(+), 18 deletions(-)
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
index aa66729..5596678 100644
--- a/.firebase/hosting.YnVpbGQ.cache
+++ b/.firebase/hosting.YnVpbGQ.cache
@@ -1,17 +1,17 @@
-asset-manifest.json,1585154135902,d2d37d7ee414a3369bff206820de947126f0460e20e27fc62948d8e893d0ae41
-index.html,1585154135899,7a0f2880679069cd485bb54def48f40d58ffece3e3f37b0b72453a5f2c60c3d7
-service-worker.js,1585154135899,9d26e4afdf826a4a6b162aaaee87a7364cf7305bdfb56d6b2c7f5d1ad7df097e
-precache-manifest.6f588a45097c27fd5c62a5615f39ec9c.js,1585154135899,38d23e59399103d554ba8e77c7d8abe01e9a8533e033273ea1ff11442f80ca8b
-static/css/2.fba55a0b.chunk.css,1585154135940,924c60cbb1fca274040a2a2c55942950e947e8e61f69e8802b30d3476d8eacff
-static/css/main.b4797ab2.chunk.css,1585154135941,0fb4914c15442a002dd44ce987468b8a10a96b37a635bb61167a5a49869fb0b6
-static/js/2.cad09d5d.chunk.js.LICENSE.txt,1585154135941,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-static/css/main.b4797ab2.chunk.css.map,1585154135943,fae17d3e512e120d19547c794effe3a7e357c8f42ecb6ed91dc4bc08039a8ce4
-static/css/2.fba55a0b.chunk.css.map,1585154135941,aef0708a2c016b136c003417e6a3741e4d99065ef70d706b0c67b676c5b1ae2f
-static/js/main.0e96c271.chunk.js,1585154135940,fea4931b930ac69df06fd2488138b7730900674c4469fc073ed4f2230cf030e5
-favicon_CN.ico,1585154104360,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/js/runtime-main.e13d1eff.js,1585154135941,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-static/js/runtime-main.e13d1eff.js.map,1585154135941,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/media/CNLOGO.c149ff8b.svg,1585154135900,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-static/js/main.0e96c271.chunk.js.map,1585154135941,7f4fa638656b502083343d3503f18fc035a2330c639ec24c6017da6aa4bff189
-static/js/2.cad09d5d.chunk.js,1585154135941,3fe8e21c2e026bc3bd71864a26e07fba6973a21565ed5d8bdf2ed62c5883459e
-static/js/2.cad09d5d.chunk.js.map,1585154135943,92fa1c03adf5416dd4ee4fe18b823e80d357f50384ca5f771f69dbe940703c2a
+asset-manifest.json,1585158336151,57c0af4d2b4e136a15f143145d665c7cabb171ce8cf5788df9a81c819e19ed70
+index.html,1585158336147,22e002f16cb7870a142f5f025c66c91b8d3c4bcf7fac509e3f908856f5518366
+precache-manifest.a1e524e6f6f257f90ef42cb8a6067d60.js,1585158336147,f220610928d47b0dc5fc7ab4ca4fb6832d5bdf737d79c51dffef392357860504
+service-worker.js,1585158336147,8895d2c50e8add3045b15704f0e9fd526e25fb636a63e558e14abd9582bcf700
+static/css/2.fba55a0b.chunk.css,1585158336185,924c60cbb1fca274040a2a2c55942950e947e8e61f69e8802b30d3476d8eacff
+static/css/main.80643931.chunk.css,1585158336148,b0c4b744335c1cfa61124708685832045a4fb3eb9f054fce8354e267354575da
+static/css/2.fba55a0b.chunk.css.map,1585158336186,aef0708a2c016b136c003417e6a3741e4d99065ef70d706b0c67b676c5b1ae2f
+static/js/2.cad09d5d.chunk.js.LICENSE.txt,1585158336186,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
+favicon_CN.ico,1585158320375,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
+static/js/main.9afa49d9.chunk.js,1585158336151,e54cb1091d2287c4da74adbd33d833ab103d112df04e3a43b1b057c493eedadc
+static/css/main.80643931.chunk.css.map,1585158336186,6437cb39d8384bd0b846304f39e8dc6a729dc5acc8a47bd8c02afd94152a7b9b
+static/js/runtime-main.e13d1eff.js,1585158336186,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
+static/js/runtime-main.e13d1eff.js.map,1585158336186,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
+static/media/CNLOGO.c149ff8b.svg,1585158336151,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
+static/js/main.9afa49d9.chunk.js.map,1585158336185,42085cc14f4baf61f80901dddc0ecfa415c086ad83a9ccfb181427482eed9126
+static/js/2.cad09d5d.chunk.js,1585158336185,3fe8e21c2e026bc3bd71864a26e07fba6973a21565ed5d8bdf2ed62c5883459e
+static/js/2.cad09d5d.chunk.js.map,1585158336188,92fa1c03adf5416dd4ee4fe18b823e80d357f50384ca5f771f69dbe940703c2a
diff --git a/src/containers/App.css b/src/containers/App.css
index 5437ec2..8ef1bd6 100644
--- a/src/containers/App.css
+++ b/src/containers/App.css
@@ -232,6 +232,11 @@ p {
/**** Extra ****/
+.toggle-btn {
+ vertical-align: bottom;
+ font-size: 1.4rem;
+}
+
.spotlight {
position: absolute;
height: 100%;
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index 0a390cd..4c08fdd 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -322,7 +322,7 @@ export default class CodingPage extends React.Component {
if (this.state.isCreator) {
readOnlyToggle =
{this.state.readOnly
?
From f5142b60ab8c8c55274b2a08028365164983e148 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Sat, 28 Mar 2020 12:34:24 +0530
Subject: [PATCH 13/51] add clone popup components
---
.firebase/hosting.YnVpbGQ.cache | 34 ++++++-------
.../ClonePopup/CloneReceivePopUp.css | 14 ++++++
.../ClonePopup/CloneReceivePopUp.js | 50 +++++++++++++++++++
src/components/ClonePopup/CloneSendPopup.css | 4 ++
src/components/ClonePopup/CloneSendPopup.js | 40 +++++++++++++++
src/containers/App.css | 27 +---------
6 files changed, 126 insertions(+), 43 deletions(-)
create mode 100644 src/components/ClonePopup/CloneReceivePopUp.css
create mode 100644 src/components/ClonePopup/CloneReceivePopUp.js
create mode 100644 src/components/ClonePopup/CloneSendPopup.css
create mode 100644 src/components/ClonePopup/CloneSendPopup.js
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
index 5596678..5996647 100644
--- a/.firebase/hosting.YnVpbGQ.cache
+++ b/.firebase/hosting.YnVpbGQ.cache
@@ -1,17 +1,17 @@
-asset-manifest.json,1585158336151,57c0af4d2b4e136a15f143145d665c7cabb171ce8cf5788df9a81c819e19ed70
-index.html,1585158336147,22e002f16cb7870a142f5f025c66c91b8d3c4bcf7fac509e3f908856f5518366
-precache-manifest.a1e524e6f6f257f90ef42cb8a6067d60.js,1585158336147,f220610928d47b0dc5fc7ab4ca4fb6832d5bdf737d79c51dffef392357860504
-service-worker.js,1585158336147,8895d2c50e8add3045b15704f0e9fd526e25fb636a63e558e14abd9582bcf700
-static/css/2.fba55a0b.chunk.css,1585158336185,924c60cbb1fca274040a2a2c55942950e947e8e61f69e8802b30d3476d8eacff
-static/css/main.80643931.chunk.css,1585158336148,b0c4b744335c1cfa61124708685832045a4fb3eb9f054fce8354e267354575da
-static/css/2.fba55a0b.chunk.css.map,1585158336186,aef0708a2c016b136c003417e6a3741e4d99065ef70d706b0c67b676c5b1ae2f
-static/js/2.cad09d5d.chunk.js.LICENSE.txt,1585158336186,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-favicon_CN.ico,1585158320375,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/js/main.9afa49d9.chunk.js,1585158336151,e54cb1091d2287c4da74adbd33d833ab103d112df04e3a43b1b057c493eedadc
-static/css/main.80643931.chunk.css.map,1585158336186,6437cb39d8384bd0b846304f39e8dc6a729dc5acc8a47bd8c02afd94152a7b9b
-static/js/runtime-main.e13d1eff.js,1585158336186,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-static/js/runtime-main.e13d1eff.js.map,1585158336186,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/media/CNLOGO.c149ff8b.svg,1585158336151,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-static/js/main.9afa49d9.chunk.js.map,1585158336185,42085cc14f4baf61f80901dddc0ecfa415c086ad83a9ccfb181427482eed9126
-static/js/2.cad09d5d.chunk.js,1585158336185,3fe8e21c2e026bc3bd71864a26e07fba6973a21565ed5d8bdf2ed62c5883459e
-static/js/2.cad09d5d.chunk.js.map,1585158336188,92fa1c03adf5416dd4ee4fe18b823e80d357f50384ca5f771f69dbe940703c2a
+asset-manifest.json,1585160474901,0ca9552747bede512f6c5143afa3431505aed6ee8e5c79e6be4124984fceda23
+precache-manifest.2eb7f8d06c47ff5e38dfc49efa4b5bba.js,1585160474898,96b30e1ac0d992c9f41ededbd8675cf82535e58765b37590b6293fc5bdbd037b
+index.html,1585160474897,1df3700f6f68c169831d1433c7c33f427887b2ea105d8b5ed8542ec1bd1511c4
+service-worker.js,1585160474897,33ddce888527754a4b4c6b0c660b50cb90fb03edf589559a58b81d9619334c9a
+static/css/2.fba55a0b.chunk.css,1585160474936,924c60cbb1fca274040a2a2c55942950e947e8e61f69e8802b30d3476d8eacff
+static/css/main.ca4cdefd.chunk.css,1585160474936,f5b26500b696c4f3926371c390ae4626b32ec8d8216b0afceeaa125622d9af8c
+static/js/2.cad09d5d.chunk.js.LICENSE.txt,1585160474936,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
+static/css/2.fba55a0b.chunk.css.map,1585160474937,aef0708a2c016b136c003417e6a3741e4d99065ef70d706b0c67b676c5b1ae2f
+static/css/main.ca4cdefd.chunk.css.map,1585160474936,f7a51ac865b6d157cc5a7ac2e83456a36afe85774556f8fce61830ab8e5d3411
+static/js/main.9edb7433.chunk.js,1585160474938,05cae95b0250c3e39e119db39798e008433c26c9549091a9ff429898053a1105
+favicon_CN.ico,1585160460001,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
+static/js/runtime-main.e13d1eff.js,1585160474938,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
+static/js/runtime-main.e13d1eff.js.map,1585160474937,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
+static/media/CNLOGO.c149ff8b.svg,1585160474936,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
+static/js/main.9edb7433.chunk.js.map,1585160474937,a59ea69f62897ec5df357bdd66c5673ff3c178a1aad2a5460454e0ddf68b5f2c
+static/js/2.cad09d5d.chunk.js,1585160474936,3fe8e21c2e026bc3bd71864a26e07fba6973a21565ed5d8bdf2ed62c5883459e
+static/js/2.cad09d5d.chunk.js.map,1585160474938,92fa1c03adf5416dd4ee4fe18b823e80d357f50384ca5f771f69dbe940703c2a
diff --git a/src/components/ClonePopup/CloneReceivePopUp.css b/src/components/ClonePopup/CloneReceivePopUp.css
new file mode 100644
index 0000000..64a2dec
--- /dev/null
+++ b/src/components/ClonePopup/CloneReceivePopUp.css
@@ -0,0 +1,14 @@
+.popup-heading {
+ font-size: 1.2rem;
+ text-align: center;
+}
+
+.popup-heading a {
+ margin-left: 8px;
+ font-size: 1.7rem;
+}
+
+.popup-heading a:hover {
+ color: red;
+ text-decoration: none;
+}
\ No newline at end of file
diff --git a/src/components/ClonePopup/CloneReceivePopUp.js b/src/components/ClonePopup/CloneReceivePopUp.js
new file mode 100644
index 0000000..070b59b
--- /dev/null
+++ b/src/components/ClonePopup/CloneReceivePopUp.js
@@ -0,0 +1,50 @@
+import React, { Component } from 'react';
+import { Modal, Button } from 'react-bootstrap';
+import 'bootstrap/dist/css/bootstrap.min.css';
+import './CloneReceivePopUp.css';
+import { newCloneSessionID } from '../../containers/pages/Coding';
+import { creatorInfo } from '../../containers/pages/Coding';
+
+export default class CloneReceivePopUp extends Component {
+
+ render(){
+
+ var session_id = newCloneSessionID.session_id;
+
+ return (
+
+
+
+
+ Copy received from {creatorInfo.user_name}!
+
+
+
+
+
+
+
+
+
+ Close
+
+
+ Open
+
+
+
+
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/src/components/ClonePopup/CloneSendPopup.css b/src/components/ClonePopup/CloneSendPopup.css
new file mode 100644
index 0000000..b20b531
--- /dev/null
+++ b/src/components/ClonePopup/CloneSendPopup.css
@@ -0,0 +1,4 @@
+.popup-heading {
+ font-size: 1.2rem;
+ text-align: center;
+}
\ No newline at end of file
diff --git a/src/components/ClonePopup/CloneSendPopup.js b/src/components/ClonePopup/CloneSendPopup.js
new file mode 100644
index 0000000..496a4fd
--- /dev/null
+++ b/src/components/ClonePopup/CloneSendPopup.js
@@ -0,0 +1,40 @@
+import React, { Component } from 'react';
+import { Modal, Button } from 'react-bootstrap';
+import 'bootstrap/dist/css/bootstrap.min.css';
+import './CloneSendPopup.css';
+
+export default class CloneSendPopup extends Component {
+
+ render(){
+
+ return (
+
+
+
+
+ Clone sent!
+
+
+
+
+
+ Created {this.props.num} clone(s).
+
+
+
+
+
+ Close
+
+
+
+
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/src/containers/App.css b/src/containers/App.css
index 8ef1bd6..9d0a82b 100644
--- a/src/containers/App.css
+++ b/src/containers/App.css
@@ -33,6 +33,7 @@
.App-title:active, .App-title:hover {
color: #fff;
+ text-decoration: none;
}
.homepage {
@@ -78,32 +79,6 @@ p {
color: #5ce198;
}
-.btn {
- display: inline-block;
- margin-bottom: 0;
- font-weight: 500;
- text-align: center;
- cursor: pointer;
- border: 1px solid transparent;
- line-height: 36px;
- padding: 0 25px;
- font-size: 14px;
- border-radius: 58px;
- text-decoration: none;
- height: 36px;
- background: transparent;
- color: #e4e4e4;
- border-color: #5ce198;
- -webkit-transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
- -o-transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
- transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
-}
-
-.btn:hover {
- background: #5ce198;
- color: black;
-}
-
.btn-coding {
display: inline-block;
margin-bottom: 0;
From b9225f06637adc9c2c4c4c4638c9f4b4d96fa2a1 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Sat, 28 Mar 2020 12:35:26 +0530
Subject: [PATCH 14/51] implement 'send-clone' feature
---
src/containers/pages/Coding.js | 230 ++++++++++++++++++++++++++++++++-
1 file changed, 226 insertions(+), 4 deletions(-)
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index 4c08fdd..6e81f88 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -4,13 +4,14 @@ import CodeMirror from "react-codemirror";
import Header from "../../components/Header/Header";
import SideDrawer from '../../components/SideDrawer/SideDrawer';
import Backdrop from '../../components/Backdrop/Backdrop';
+import CloneReceivePopUp from '../../components/ClonePopup/CloneReceivePopUp';
+import CloneSendPopup from '../../components/ClonePopup/CloneSendPopup';
import { database } from "firebase/app";
import { firebaseAuth } from "../../config/firebase-config";
import { logout } from "../../helpers/auth";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { faBars } from '@fortawesome/free-solid-svg-icons';
-import { faToggleOn } from '@fortawesome/free-solid-svg-icons';
-import { faToggleOff } from '@fortawesome/free-solid-svg-icons';
+import { faBars, faFileExport } from '@fortawesome/free-solid-svg-icons';
+import { faToggleOn, faToggleOff } from '@fortawesome/free-solid-svg-icons';
import "codemirror/lib/codemirror";
import "codemirror/lib/codemirror.css";
@@ -31,6 +32,8 @@ const appTokenKey = "appToken";
const sessionID = "sessionID";
const usersList = [];
const creatorInfo = {};
+const newCloneSessionID = {};
+const clonesCreated = {};
export default class CodingPage extends React.Component {
@@ -50,9 +53,11 @@ export default class CodingPage extends React.Component {
// setting initial state
this.state = {
key: random.generate(3), // for storing connected-users
+ cloneTrigger: random.generate(3), // for triggering clone feature
readOnly: false,
isCreator: false,
sideDrawerOpen: false,
+ clonePopupShow: false,
code: "Loading...",
cursorPosition: {
line: 0,
@@ -79,6 +84,7 @@ export default class CodingPage extends React.Component {
// setting initial state
state = {
sideDrawerOpen: false,
+ clonePopupShow: false,
code: "Loading...",
cursorPosition: {
line: 0,
@@ -167,10 +173,19 @@ export default class CodingPage extends React.Component {
this.setState({ isCreator: true });
}
+ // setting states of 'cloneTrigger' & 'isFirstLoad' in database
+ database()
+ .ref(`code-sessions/${session_id}/cloneHelper`)
+ .update({
+ cloneTrigger: this.state.cloneTrigger,
+ isFirstLoad: true,
+ });
+
// displaying users-connected from database
database()
.ref(`code-sessions/${params.sessionid}/users-connected`)
.on('value', snapshot => {
+ clonesCreated.numOfClonesCreated = snapshot.numChildren();
console.log("\nConnected users: ");
usersList.splice(0, usersList.length);
var i = 0;
@@ -203,6 +218,156 @@ export default class CodingPage extends React.Component {
}
});
+ // 'received-clone' pop-up handler
+ if(!this.state.isCreator){
+ // fetching and then setting state of 'clonePopupShow' from database
+ database()
+ .ref(`code-sessions/${params.sessionid}/cloneHelper/clonePopupShow`)
+ .on('value', snapshot => {
+ // console.log("'clonePopupShow' state changed!");
+ let clonePopupShowState = snapshot.val();
+ if(clonePopupShowState){
+ this.setState({
+ clonePopupShow: true,
+ });
+ }
+
+ // setting state of 'clonePopupShow' to false in database
+ // after delay of 500 milliseconds
+ function clonePopupShowStateDelay(){
+ database()
+ .ref(`code-sessions/${params.sessionid}/cloneHelper/clonePopupShow`)
+ .set(false);
+ }
+ setTimeout(clonePopupShowStateDelay, 500);
+
+ });
+ }
+
+ var date;
+
+ // 'send-clone' button functionality
+ // executes when 'send-clone' button is clicked
+ // i.e. when 'cloneTrigger' key is changed in database
+ database()
+ .ref(`code-sessions/${params.sessionid}/cloneHelper/cloneTrigger`)
+ .on('value', snapshot => {
+
+ database()
+ .ref(`code-sessions/${session_id}/cloneHelper`)
+ .once("value")
+ .then(snapshot => {
+ let isFirstLoad = snapshot.val().isFirstLoad;
+
+ // does not execute on first load of page
+ if(isFirstLoad === false){
+
+ // console.log("sendCloneButton clicked!");
+
+ date = Date();
+
+ // fetching existing code in this session ID to be cloned
+ var existingContent;
+ database()
+ .ref(`code-sessions/${session_id}`)
+ .once("value")
+ .then(snapshot => {
+ existingContent = snapshot.val().content;
+ })
+ .catch(e => {
+ console.log(e);
+ });
+
+ // only creator can create new sessions with cloned code
+ if(this.state.isCreator){
+
+ database()
+ .ref(`code-sessions/${session_id}/users-connected`)
+ .once("value")
+ .then(snapshot => {
+ // console.log("New clone being created.");
+
+ snapshot.forEach(function(childSnapshot){
+
+ // console.log(existingContent);
+ let newSessionKey = random.generate(5);
+ let userData = childSnapshot.val();
+
+ // creating new session with cloned code
+ database()
+ .ref("code-sessions/" + newSessionKey)
+ .set({
+ cloneSentBy: creator_uid,
+ content: existingContent,
+ createdon: date,
+ readOnly: false,
+ });
+
+ // adding details of the user as creator to the database
+ database()
+ .ref("code-sessions/" + newSessionKey + "/creator")
+ .set({
+ user_id: userData.user_id,
+ user_name: userData.user_name,
+ user_email: userData.user_email,
+ user_photo: userData.user_photo
+ });
+
+ });
+
+ // setting 'numOfClonesCreated' to be passed in props of 'CloneSendPopup'
+ clonesCreated.numOfClonesCreated = snapshot.numChildren();
+ console.log(`Created ${snapshot.numChildren()} clone(s)`);
+
+ })
+ .catch(e => {
+ console.log(e);
+ });
+ }
+
+ // finding new session id with cloned content
+ // for currently signed-in user
+ // and storing that session id in 'newCloneSessionID' object
+ if(!this.state.isCreator){
+
+ // console.log(date);
+ // comparing date of session created exluding the 'seconds' time
+ var dateCompressed = date.substring(0, 21);
+
+ database()
+ .ref(`code-sessions/`)
+ .on('value', snapshot => {
+ snapshot.forEach(function(childSnapshot){
+
+ let cloneSentBy = childSnapshot.child("cloneSentBy").val();
+ let user_id = childSnapshot.child("creator").child("user_id").val();
+ let content = childSnapshot.child("content").val();
+ let createdOn = childSnapshot.child("createdon").val();
+ let createdOnCompressed = createdOn.substring(0, 21);
+
+ // Comparing: content (code), user id (uid),
+ // cloneSentBy (creator id), date (createOn)
+ if(cloneSentBy === creator_uid
+ && user_id === user.uid
+ && content === existingContent
+ && createdOnCompressed === dateCompressed) {
+
+ let cloneSessionID = childSnapshot.key;
+ newCloneSessionID.session_id = cloneSessionID;
+ // console.log(`Clone found at session ID: ${cloneSessionID} \n`);
+ return true;
+ }
+ });
+
+ })
+ }
+
+ }
+
+ })
+
+ });
+
} else {
console.log("Cannot fetch currently signed-in user!");
}
@@ -310,6 +475,22 @@ export default class CodingPage extends React.Component {
this.codeRef.child("readOnly").set(!this.state.readOnly);
};
+ // 'send-clone' button handler
+ sendCloneHandler = () => {
+ let newCloneTrigger = random.generate(3);
+ this.setState({
+ clonePopupShow: true,
+ cloneTrigger: newCloneTrigger,
+ });
+ // setting 'isFirstLoad' to false in database
+ this.codeRef.child("cloneHelper").child("isFirstLoad").set(false);
+ // setting 'clonePopupShow' state to true in database
+ this.codeRef.child("cloneHelper").child("clonePopupShow").set(true);
+ // updating 'cloneTrigger' value and 'clonePopupShow' state in database
+ // indicating 'send-clone' button is clicked
+ this.codeRef.child("cloneHelper").child("cloneTrigger").set(newCloneTrigger);
+ };
+
render() {
let backdrop;
@@ -330,6 +511,17 @@ export default class CodingPage extends React.Component {
}
+ // 'send-clone' button is only displayed when current user is the creator of session
+ let sendCloneButton;
+ if (this.state.isCreator) {
+ sendCloneButton =
+
+
+
+ }
+
// this button is only displayed to the users-connected (not the creator)
let userEditingToggle;
if (!this.state.isCreator) {
@@ -346,6 +538,30 @@ export default class CodingPage extends React.Component {
}
+ // to close the send/receive clone popup
+ let clonePopupClose = () => {
+ this.setState({clonePopupShow: false});
+ }
+
+ let clonePopUp;
+ if (!this.state.isCreator) {
+ // render 'clone-received' pop-up component
+ clonePopUp =
+
+ } else {
+ // render 'clone-sent' pop-up component
+ clonePopUp =
+
+ }
+
return (
@@ -356,6 +572,7 @@ export default class CodingPage extends React.Component {
{this.state.createdon
? `Created On: ${this.state.createdon}`
: ""}
+ { sendCloneButton }
{ readOnlyToggle }
{ userEditingToggle }
@@ -368,6 +585,8 @@ export default class CodingPage extends React.Component {
}
/>
+ { clonePopUp }
+
{ backdrop }
@@ -404,4 +623,7 @@ export default class CodingPage extends React.Component {
export {usersList};
// exporting creator info object
-export {creatorInfo};
\ No newline at end of file
+export {creatorInfo};
+
+// exporting new session ID with cloned code to each user-connected
+export {newCloneSessionID};
\ No newline at end of file
From c353693db01a36f40199f7b177c635fa58341282 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Sat, 28 Mar 2020 12:36:26 +0530
Subject: [PATCH 15/51] modified css
---
src/containers/App.css | 36 ++++++++++++++++++++++++++++++++++++
src/containers/pages/Home.js | 4 ++--
2 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/src/containers/App.css b/src/containers/App.css
index 9d0a82b..c3e02a4 100644
--- a/src/containers/App.css
+++ b/src/containers/App.css
@@ -79,6 +79,32 @@ p {
color: #5ce198;
}
+.btn-home {
+ display: inline-block;
+ margin-bottom: 0;
+ font-weight: 500;
+ text-align: center;
+ cursor: pointer;
+ border: 1px solid transparent;
+ line-height: 36px;
+ padding: 0 25px;
+ font-size: 14px;
+ border-radius: 58px;
+ text-decoration: none;
+ height: 36px;
+ background: transparent;
+ color: #e4e4e4;
+ border-color: #5ce198;
+ -webkit-transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
+ -o-transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
+ transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
+}
+
+.btn-home:hover {
+ background: #5ce198;
+ color: black;
+}
+
.btn-coding {
display: inline-block;
margin-bottom: 0;
@@ -149,6 +175,10 @@ p {
font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
color: #222;
margin-top: 5%;
+ margin-bottom: 1.3rem;
+ line-height: 1.5;
+ font-size: 2em;
+ font-weight: bold;
}
/**** Spinning Logo ****/
@@ -212,6 +242,12 @@ p {
font-size: 1.4rem;
}
+.clone-btn {
+ vertical-align: bottom;
+ border-radius: 11px;
+ font-size: 1.2rem;
+}
+
.spotlight {
position: absolute;
height: 100%;
diff --git a/src/containers/pages/Home.js b/src/containers/pages/Home.js
index e3de369..b3eb9c6 100644
--- a/src/containers/pages/Home.js
+++ b/src/containers/pages/Home.js
@@ -95,10 +95,10 @@ export default class HomePage extends React.Component {
Simple Realtime Code Sharing Editor App.
-
+
Share Code
-
+
Sign Out
From 093bbf2c6371f09f94107e201427dde029536268 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Sat, 28 Mar 2020 12:41:03 +0530
Subject: [PATCH 16/51] install react-bootstrap dependency
---
package-lock.json | 156 ++++++++++++++++++++++++++++++++++++++++++++++
package.json | 2 +
2 files changed, 158 insertions(+)
diff --git a/package-lock.json b/package-lock.json
index 4c01fc4..5e8d282 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1726,6 +1726,11 @@
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
"integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
},
+ "@popperjs/core": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.1.1.tgz",
+ "integrity": "sha512-sLqWxCzC5/QHLhziXSCAksBxHfOnQlhPRVgPK0egEw+ktWvG75T2k+aYWVjVh9+WKeT3tlG3ZNbZQvZLmfuOIw=="
+ },
"@protobufjs/aspromise": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
@@ -1780,6 +1785,20 @@
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
"integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
},
+ "@restart/context": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz",
+ "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q=="
+ },
+ "@restart/hooks": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.22.tgz",
+ "integrity": "sha512-tW0T3hP6emYNOc76/iC96rlu+f7JYLSVk/Wnn+7dj1gJUcw4CkQNLy16vx2mBLtVKsFMZ9miVEZXat8blruDHQ==",
+ "requires": {
+ "lodash": "^4.17.15",
+ "lodash-es": "^4.17.15"
+ }
+ },
"@sheerun/mutationobserver-shim": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz",
@@ -3355,6 +3374,11 @@
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
},
+ "bootstrap": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz",
+ "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA=="
+ },
"bowser": {
"version": "1.9.4",
"resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz",
@@ -10598,6 +10622,11 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
},
+ "lodash-es": {
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz",
+ "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ=="
+ },
"lodash._isnative": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz",
@@ -13336,6 +13365,25 @@
"react-is": "^16.8.1"
}
},
+ "prop-types-extra": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz",
+ "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==",
+ "requires": {
+ "react-is": "^16.3.2",
+ "warning": "^4.0.0"
+ },
+ "dependencies": {
+ "warning": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
+ "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ }
+ }
+ },
"protobufjs": {
"version": "6.8.8",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz",
@@ -13563,6 +13611,65 @@
"whatwg-fetch": "^3.0.0"
}
},
+ "react-bootstrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.0.0.tgz",
+ "integrity": "sha512-Ep6ZNH6wL5m9bytOS6T9mjSz0YE1bEkc+uHItvenRcA3amr5ApkpKYzAWgdglhRPZHPvm+pnqs1z5IPwv/2UZw==",
+ "requires": {
+ "@babel/runtime": "^7.4.2",
+ "@restart/context": "^2.1.4",
+ "@restart/hooks": "^0.3.21",
+ "@types/react": "^16.9.23",
+ "classnames": "^2.2.6",
+ "dom-helpers": "^5.1.2",
+ "invariant": "^2.2.4",
+ "prop-types": "^15.7.2",
+ "prop-types-extra": "^1.1.0",
+ "react-overlays": "^3.0.1",
+ "react-transition-group": "^4.0.0",
+ "uncontrollable": "^7.0.0",
+ "warning": "^4.0.3"
+ },
+ "dependencies": {
+ "@types/react": {
+ "version": "16.9.26",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.26.tgz",
+ "integrity": "sha512-dGuSM+B0Pq1MKXYUMlUQWeS6Jj9IhSAUf9v8Ikaimj+YhkBcQrihWBkmyEhK/1fzkJTwZQkhZp5YhmWa2CH+Rw==",
+ "requires": {
+ "@types/prop-types": "*",
+ "csstype": "^2.2.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"
+ }
+ },
+ "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"
+ }
+ },
+ "warning": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
+ "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ }
+ }
+ },
"react-codemirror": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/react-codemirror/-/react-codemirror-1.0.0.tgz",
@@ -13786,6 +13893,44 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz",
"integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q=="
},
+ "react-lifecycles-compat": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
+ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
+ },
+ "react-overlays": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-3.0.1.tgz",
+ "integrity": "sha512-QEt6I3Cjy06pe2FwY/tuWaXEzSVOuXfP8zsC6oWHJhMYpEJQgZV/TCwbCw5slMW6VcgwcWPc4HrBzN0yfxf5Xw==",
+ "requires": {
+ "@babel/runtime": "^7.4.5",
+ "@popperjs/core": "^2.0.0",
+ "@restart/hooks": "^0.3.12",
+ "dom-helpers": "^5.1.0",
+ "prop-types": "^15.7.2",
+ "uncontrollable": "^7.0.0",
+ "warning": "^4.0.3"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "warning": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
+ "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ }
+ }
+ },
"react-router": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz",
@@ -16239,6 +16384,17 @@
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz",
"integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ=="
},
+ "uncontrollable": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.1.1.tgz",
+ "integrity": "sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q==",
+ "requires": {
+ "@babel/runtime": "^7.6.3",
+ "@types/react": "^16.9.11",
+ "invariant": "^2.2.4",
+ "react-lifecycles-compat": "^3.0.4"
+ }
+ },
"unicode-canonical-property-names-ecmascript": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
diff --git a/package.json b/package.json
index de19159..68ac02a 100644
--- a/package.json
+++ b/package.json
@@ -9,12 +9,14 @@
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
+ "bootstrap": "^4.4.1",
"env-cmd": "^10.1.0",
"firebase": "^7.9.1",
"firebase-tools": "^7.13.1",
"material-ui": "^0.20.2",
"random-key": "^0.3.2",
"react": "^16.12.0",
+ "react-bootstrap": "^1.0.0",
"react-codemirror": "^1.0.0",
"react-dom": "^16.12.0",
"react-helmet": "^5.2.1",
From dd9d8ef67b6af16486a85e38330524c3fec3d930 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 7 Apr 2020 12:28:56 +0530
Subject: [PATCH 17/51] add clone-send (to single user) popup component
---
.firebase/hosting.YnVpbGQ.cache | 34 ++++++++--------
.../ClonePopup/CloneReceivePopUp.js | 6 +--
src/components/ClonePopup/CloneSendPopup.js | 2 +-
.../ClonePopup/CloneSendPopupSingle.js | 40 +++++++++++++++++++
4 files changed, 61 insertions(+), 21 deletions(-)
create mode 100644 src/components/ClonePopup/CloneSendPopupSingle.js
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
index 5996647..d55c682 100644
--- a/.firebase/hosting.YnVpbGQ.cache
+++ b/.firebase/hosting.YnVpbGQ.cache
@@ -1,17 +1,17 @@
-asset-manifest.json,1585160474901,0ca9552747bede512f6c5143afa3431505aed6ee8e5c79e6be4124984fceda23
-precache-manifest.2eb7f8d06c47ff5e38dfc49efa4b5bba.js,1585160474898,96b30e1ac0d992c9f41ededbd8675cf82535e58765b37590b6293fc5bdbd037b
-index.html,1585160474897,1df3700f6f68c169831d1433c7c33f427887b2ea105d8b5ed8542ec1bd1511c4
-service-worker.js,1585160474897,33ddce888527754a4b4c6b0c660b50cb90fb03edf589559a58b81d9619334c9a
-static/css/2.fba55a0b.chunk.css,1585160474936,924c60cbb1fca274040a2a2c55942950e947e8e61f69e8802b30d3476d8eacff
-static/css/main.ca4cdefd.chunk.css,1585160474936,f5b26500b696c4f3926371c390ae4626b32ec8d8216b0afceeaa125622d9af8c
-static/js/2.cad09d5d.chunk.js.LICENSE.txt,1585160474936,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-static/css/2.fba55a0b.chunk.css.map,1585160474937,aef0708a2c016b136c003417e6a3741e4d99065ef70d706b0c67b676c5b1ae2f
-static/css/main.ca4cdefd.chunk.css.map,1585160474936,f7a51ac865b6d157cc5a7ac2e83456a36afe85774556f8fce61830ab8e5d3411
-static/js/main.9edb7433.chunk.js,1585160474938,05cae95b0250c3e39e119db39798e008433c26c9549091a9ff429898053a1105
-favicon_CN.ico,1585160460001,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/js/runtime-main.e13d1eff.js,1585160474938,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-static/js/runtime-main.e13d1eff.js.map,1585160474937,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/media/CNLOGO.c149ff8b.svg,1585160474936,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-static/js/main.9edb7433.chunk.js.map,1585160474937,a59ea69f62897ec5df357bdd66c5673ff3c178a1aad2a5460454e0ddf68b5f2c
-static/js/2.cad09d5d.chunk.js,1585160474936,3fe8e21c2e026bc3bd71864a26e07fba6973a21565ed5d8bdf2ed62c5883459e
-static/js/2.cad09d5d.chunk.js.map,1585160474938,92fa1c03adf5416dd4ee4fe18b823e80d357f50384ca5f771f69dbe940703c2a
+asset-manifest.json,1585379384399,5f1acfdb8f91f5df51e2a63b3b4ed2d8b4329471d532666ced64bc01df579cfe
+index.html,1585379384395,7c14b9a6f0a46c22aa933410f7859495986932f50e635103ccc535a9b1ec8917
+precache-manifest.7a60d5a85af2390dc1e080088cd2ae17.js,1585379384395,1a928a2cf49b2b8cb54960b513d8604a591c8acf6ec70428237acb9734baf4fa
+service-worker.js,1585379384395,9412fc08ce2ee5f28ff6c1e6bb63bf1cb44effd6b860ea15a123f2b784ef80eb
+static/css/main.526481a2.chunk.css,1585379384434,6c94f2728d2171c0bfcba02645ffed573844e225b7e5932489238c4cd4671c66
+static/css/main.526481a2.chunk.css.map,1585379384434,89d1643ddb7230149d9e570d6ce96418bc956b2e977a93878f25becc62b35842
+static/js/2.72309e5d.chunk.js.LICENSE.txt,1585379384437,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
+static/js/main.e2c833e9.chunk.js,1585379384434,ec9ff036d58f04fe425ed445e450592971a4cd72eca1114f463aa493199c4ed0
+static/js/runtime-main.e13d1eff.js,1585379384437,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
+static/js/runtime-main.e13d1eff.js.map,1585379384440,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
+static/media/CNLOGO.c149ff8b.svg,1585379384434,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
+favicon_CN.ico,1585379354230,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
+static/js/main.e2c833e9.chunk.js.map,1585379384437,29a6674f4346c387af32b31073e544344fc4391bc32c2163d35cf56ebc8bdc22
+static/css/2.918a5898.chunk.css,1585379384396,32b8d2f30d1ddc5a96ca009ec979dc5955f8e6ab686e92effe43431d8ca75613
+static/css/2.918a5898.chunk.css.map,1585379384435,5c6cabc6d428b62a1ae4417b0816785f7e933f56156cc7be0475f8bf87583f84
+static/js/2.72309e5d.chunk.js,1585379384437,59c6a7dbb63f9ef46c71d39c3a78e38a2367cae8392e98d530864e4aaa517c9a
+static/js/2.72309e5d.chunk.js.map,1585379384436,015bee67830d89b059201c60bc8d0a8ff7a82b8c0f207025acaddf5b3703aa55
diff --git a/src/components/ClonePopup/CloneReceivePopUp.js b/src/components/ClonePopup/CloneReceivePopUp.js
index 070b59b..1ec6c4c 100644
--- a/src/components/ClonePopup/CloneReceivePopUp.js
+++ b/src/components/ClonePopup/CloneReceivePopUp.js
@@ -1,11 +1,11 @@
import React, { Component } from 'react';
import { Modal, Button } from 'react-bootstrap';
import 'bootstrap/dist/css/bootstrap.min.css';
-import './CloneReceivePopUp.css';
-import { newCloneSessionID } from '../../containers/pages/Coding';
+import './CloneReceivePopup.css';
import { creatorInfo } from '../../containers/pages/Coding';
+import { newCloneSessionID } from '../SideDrawer/SideDrawer';
-export default class CloneReceivePopUp extends Component {
+export default class CloneReceivePopup extends Component {
render(){
diff --git a/src/components/ClonePopup/CloneSendPopup.js b/src/components/ClonePopup/CloneSendPopup.js
index 496a4fd..603c9ee 100644
--- a/src/components/ClonePopup/CloneSendPopup.js
+++ b/src/components/ClonePopup/CloneSendPopup.js
@@ -23,7 +23,7 @@ export default class CloneSendPopup extends Component {
- Created {this.props.num} clone(s).
+ Created {this.props.num} clone(s).
diff --git a/src/components/ClonePopup/CloneSendPopupSingle.js b/src/components/ClonePopup/CloneSendPopupSingle.js
new file mode 100644
index 0000000..4ad6164
--- /dev/null
+++ b/src/components/ClonePopup/CloneSendPopupSingle.js
@@ -0,0 +1,40 @@
+import React, { Component } from 'react';
+import { Modal, Button } from 'react-bootstrap';
+import 'bootstrap/dist/css/bootstrap.min.css';
+import './CloneSendPopup.css';
+
+export default class CloneSendPopupSingle extends Component {
+
+ render(){
+
+ return (
+
+
+
+
+ Clone sent!
+
+
+
+
+
+ Created 1 clone.
+
+
+
+
+
+ Close
+
+
+
+
+ );
+ }
+
+}
\ No newline at end of file
From 93a0e1e3a3a69cc0355fd510c90da393357433ef Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 7 Apr 2020 12:31:15 +0530
Subject: [PATCH 18/51] add function to send clone to particular user
---
src/components/SideDrawer/SideDrawer.css | 106 ----
src/components/SideDrawer/SideDrawer.js | 652 ++++++++++++++++++++++-
2 files changed, 648 insertions(+), 110 deletions(-)
delete mode 100644 src/components/SideDrawer/SideDrawer.css
diff --git a/src/components/SideDrawer/SideDrawer.css b/src/components/SideDrawer/SideDrawer.css
deleted file mode 100644
index bc73ad0..0000000
--- a/src/components/SideDrawer/SideDrawer.css
+++ /dev/null
@@ -1,106 +0,0 @@
-.side-drawer {
- height: 100%;
- background: white;
- box-shadow: 1px 0px 7px rgba(0, 0, 0, 0.5);
- position: fixed;
- top: 0;
- /* left: 0; */
- right: 0;
- width: 70%;
- max-width: 300px;
- z-index: 200;
- /* transform: translateX(-100%); */
- transform: translateX(100%);
- transition: transform 0.3s ease-out;
- overflow: auto;
-}
-
-.side-drawer.open {
- transform: translateX(0);
-}
-
-.side-drawer .heading {
- display: flex;
- align-items: center;
- justify-content: center;
- margin-top: 8px;
- padding: 6px 0px;
- color: #000000;
- font-size: 1.2rem;
- text-decoration: none;
- vertical-align: center;
-}
-
-.side-drawer .divider {
- margin: 8px auto;
- height: 1px;
- width: 80%;
- background-color: #757575;
-}
-
-.side-drawer .divider-thick {
- margin: 18px auto;
- height: 2px;
- width: 90%;
- background-color: #423939cc;
-}
-
-.side-drawer .creator-info {
- display: flex;
- align-items: center;
- margin: 3px 0;
- padding: 0 40px;
-}
-
-.side-drawer .creator-info img {
- height: 2.3rem;
- width: 2.3rem;
- border-radius: 50%;
- border: 1px solid #222;
-}
-
-.side-drawer .creator-info span {
- color: #000000;
- font-size: 1rem;
- margin-left: 10px;
-}
-
-.side-drawer ul {
- margin: 0;
- padding: 0 40px;
- height: 75%;
- list-style: none;
- display: flex;
- flex-direction: column;
-}
-
-.side-drawer ul li {
- margin: 3px 0;
- display: flex;
- align-items: center;
- /* justify-content: center; */
-}
-
-.side-drawer ul li img {
- height: 2.3rem;
- width: 2.3rem;
- border-radius: 50%;
- border: 1px solid #222;
-}
-
-.side-drawer ul li span {
- color: #000000;
- font-size: 1rem;
- margin-left: 10px;
-}
-
-.side-drawer ul li span:hover {
- color: #800000;
- cursor: default;
-}
-
-/* @media (min-width: 769px) {
- .side-drawer {
- display: none;
- }
-} */
\ No newline at end of file
diff --git a/src/components/SideDrawer/SideDrawer.js b/src/components/SideDrawer/SideDrawer.js
index 67dffb7..a09e725 100644
--- a/src/components/SideDrawer/SideDrawer.js
+++ b/src/components/SideDrawer/SideDrawer.js
@@ -1,14 +1,648 @@
import React from 'react';
+import random from "random-key";
import './SideDrawer.css';
-import { creatorInfo } from '../../containers/pages/Coding';
-import { usersList } from '../../containers/pages/Coding';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { faFileExport } from '@fortawesome/free-solid-svg-icons';
+import { database } from "firebase/app";
+import { firebaseAuth } from "../../config/firebase-config";
+import CloneSendPopup from '../ClonePopup/CloneSendPopup';
+import CloneSendPopupSingle from '../ClonePopup/CloneSendPopupSingle';
+import CloneReceivePopup from '../ClonePopup/CloneReceivePopup';
+
+const clonesCreated = {};
+const creatorInfo = {};
+const usersList = [];
+const newCloneSessionID = {};
export default class sideDrawer extends React.Component {
+ constructor(props) {
+ super(props);
+
+ // setting initial state
+ this.state = {
+ cloneTrigger: random.generate(3), // for triggering clone feature
+ isCreator: false,
+ clonePopupShow: false,
+ clonePopupShowSingle: false,
+ };
+
+ this.sendSingleCloneHandler = this.sendSingleCloneHandler.bind(this);
+
+ }
+
+ // setting initial state
+ state = {
+ clonePopupShow: false,
+ clonePopupShowSingle: false,
+ };
+
+ componentDidMount = () => {
+
+ const session_id = this.props.session_id;
+ var userConnectedRef = database().ref(`code-sessions/${session_id}/users-connected`);
+
+ // to fetch currently signed-in user
+ firebaseAuth().onAuthStateChanged(async (user) => {
+ try {
+ if (user) {
+
+ var creator_uid;
+
+ // fetch session creator's uid from database
+ // const creator_uid = await database()
+ await database()
+ .ref(`code-sessions/${session_id}/creator`)
+ .once("value")
+ .then(snapshot => {
+ var creatorData = snapshot.val();
+ creator_uid = creatorData.user_id;
+ creatorInfo.user_name = creatorData.user_name;
+ creatorInfo.user_photo = creatorData.user_photo;
+ // console.log(creatorData);
+ })
+ .catch(e => {
+ // no session found corresponding to "sessionid" passed in the params
+ });
+
+ if (creator_uid === undefined ){
+ // console.log("No Session Found!");
+ return;
+ }
+
+ if (user.uid === creator_uid){
+ // console.log("Current user is the session creator");
+ this.setState({ isCreator: true });
+ }
+
+ // setting states of 'cloneTrigger' & 'isFirstLoad' in database
+ database()
+ .ref(`code-sessions/${session_id}/cloneHelper`)
+ .update({
+ cloneTrigger: this.state.cloneTrigger,
+ isFirstLoad: true,
+ });
+
+ // setting states of 'cloneTrigger' & 'isFirstLoad' in database
+ database()
+ .ref(`code-sessions/${session_id}/singleCloneHelper`)
+ .update({
+ cloneTrigger: this.state.cloneTrigger,
+ isFirstLoad: true,
+ });
+
+ // displaying users-connected from database
+ database()
+ .ref(`code-sessions/${session_id}/users-connected`)
+ .on('value', snapshot => {
+ clonesCreated.numOfClonesCreated = snapshot.numChildren();
+ console.log("\nConnected users: ");
+ usersList.splice(0, usersList.length);
+ var i = 0;
+
+ let self = this;
+ let isCreator = this.state.isCreator;
+
+ snapshot.forEach(function(childSnapshot){
+
+ var userData = childSnapshot.val();
+ console.log(userData.user_name + " - " + userData.user_email);
+ // console.log(userData.cloneSessionID);
+
+ let cloneLink;
+ if(userData.cloneSessionID === undefined){
+ cloneLink = `/404`;
+ } else {
+ cloneLink = `/home/${userData.cloneSessionID}`;
+ }
+
+ let displayUserNameCloneLink;
+ if(isCreator){
+ displayUserNameCloneLink =
+
+ {userData.user_name}
+
+ } else {
+ displayUserNameCloneLink =
+ {userData.user_name}
+ }
+
+ let sendSingleCloneButton;
+ if(isCreator) {
+ sendSingleCloneButton =
+
+
+
+
+
+ }
+
+ usersList.push(
+
+
+
+ { displayUserNameCloneLink }
+
+ { sendSingleCloneButton }
+
+ );
+ i++;
+
+ });
+ console.log("\n");
+ });
+
+ // 'received-clone' pop-up handler
+ if(!this.state.isCreator){
+ // fetching and then setting state of 'clonePopupShow' from database
+ database()
+ .ref(`code-sessions/${session_id}/cloneHelper/clonePopupShow`)
+ .on('value', snapshot => {
+ // console.log("'clonePopupShow' state changed!");
+ let clonePopupShowState = snapshot.val();
+ if(clonePopupShowState){
+ this.setState({
+ clonePopupShow: true,
+ });
+ }
+
+ // setting state of 'clonePopupShow' to false in database
+ // after delay of 500 milliseconds
+ function clonePopupShowStateDelay(){
+ database()
+ .ref(`code-sessions/${session_id}/cloneHelper/clonePopupShow`)
+ .set(false);
+ }
+ setTimeout(clonePopupShowStateDelay, 500);
+
+ });
+
+ // fetching and then setting state of 'clonePopupShow' from database
+ database()
+ .ref(`code-sessions/${session_id}/singleCloneHelper/clonePopupShow`)
+ .on('value', snapshot => {
+ // console.log("'clonePopupShow' state changed!");
+
+ database()
+ .ref(`code-sessions/${session_id}/singleCloneHelper`)
+ .once("value")
+ .then(snapshot => {
+ let isFirstLoad = snapshot.val().isFirstLoad;
+
+ // does not execute on first load of page
+ if(isFirstLoad === false){
+ let user_uid = snapshot.val().user_uid;
+
+ if(user.uid === user_uid){
+
+ let clonePopupShowState = snapshot.val();
+ if(clonePopupShowState){
+ this.setState({
+ clonePopupShow: true,
+ });
+ }
+
+ // setting state of 'clonePopupShow' to false in database
+ // after delay of 500 milliseconds
+ function clonePopupShowStateDelay(){
+ database()
+ .ref(`code-sessions/${session_id}/singleCloneHelper/clonePopupShow`)
+ .set(false);
+ }
+ setTimeout(clonePopupShowStateDelay, 500);
+
+ }
+
+ }
+
+ })
+ .catch(e => {
+ console.log(e);
+ });
+
+ });
+
+ }
+
+ var date;
+
+ // 'send-single-clone' button functionality
+ // executes when 'send-single-clone' button is clicked
+ // i.e. when 'cloneTrigger' key is changed in database
+ database()
+ .ref(`code-sessions/${session_id}/singleCloneHelper/cloneTrigger`)
+ .on('value', snapshot => {
+
+ database()
+ .ref(`code-sessions/${session_id}/singleCloneHelper`)
+ .once("value")
+ .then(snapshot => {
+ let isFirstLoad = snapshot.val().isFirstLoad;
+
+ // does not execute on first load of page
+ if(isFirstLoad === false){
+
+ // console.log("sendSingleCloneButton clicked!");
+
+ let user_uid = snapshot.val().user_uid;
+
+ date = Date();
+
+ // fetching existing code in this session ID to be cloned
+ var existingContent;
+ database()
+ .ref(`code-sessions/${session_id}`)
+ .once("value")
+ .then(snapshot => {
+ existingContent = snapshot.val().content;
+ })
+ .catch(e => {
+ console.log(e);
+ });
+
+ // only creator can create new session with cloned code
+ if(this.state.isCreator){
+
+ database()
+ .ref(`code-sessions/${session_id}/users-connected`)
+ .once("value")
+ .then(snapshot => {
+ // console.log("New clone being created.");
+
+ snapshot.forEach(function(childSnapshot){
+
+ // console.log(existingContent);
+
+ if(childSnapshot.val().user_id === user_uid){
+ let newSessionKey = random.generate(5);
+ let userData = childSnapshot.val();
+
+ // creating new session with cloned code
+ database()
+ .ref("code-sessions/" + newSessionKey)
+ .set({
+ cloneSentBy: creator_uid,
+ content: existingContent,
+ createdon: date,
+ readOnly: false,
+ });
+
+ // adding details of the user as creator to the database
+ database()
+ .ref("code-sessions/" + newSessionKey + "/creator")
+ .set({
+ user_id: userData.user_id,
+ user_name: userData.user_name,
+ user_email: userData.user_email,
+ user_photo: userData.user_photo
+ });
+
+ return true;
+ }
+
+ });
+
+ console.log(`Clone sent!`);
+
+ })
+ .catch(e => {
+ console.log(e);
+ });
+ }
+
+ // finding new session id with cloned content
+ // for currently signed-in user
+ // and storing that session id in 'newCloneSessionID' object
+ if(!this.state.isCreator){
+
+ // console.log(date);
+ // comparing date of session created exluding the 'seconds' time
+ var dateCompressed = date.substring(0, 21);
+
+ database()
+ .ref(`code-sessions/`)
+ .once("value")
+ .then(snapshot => {
+ snapshot.forEach(function(childSnapshot){
+
+ console.clear();
+ console.log("Searching...");
+
+ let cloneSentBy = childSnapshot.child("cloneSentBy").val();
+ let user_id = childSnapshot.child("creator").child("user_id").val();
+ let content = childSnapshot.child("content").val();
+ let createdOn = childSnapshot.child("createdon").val();
+ let createdOnCompressed = createdOn.substring(0, 21);
+
+ // Comparing: content (code), user id (uid),
+ // cloneSentBy (creator id), date (createOn)
+ if(cloneSentBy === creator_uid
+ && user_id === user.uid
+ && content === existingContent
+ && createdOnCompressed === dateCompressed) {
+
+ let cloneSessionID = childSnapshot.key;
+ newCloneSessionID.session_id = cloneSessionID;
+
+ console.log(`Clone found at session ID: ${cloneSessionID}`);
+
+ userConnectedRef
+ .once("value")
+ .then(snapshot => {
+ snapshot.forEach(function(childSnapshot){
+ let user_id = childSnapshot.val().user_id;
+ if(user_id === user.uid) {
+ console.log(`User details stored under "${childSnapshot.key}" in database`);
+ database()
+ .ref(`code-sessions/${session_id}/users-connected/${childSnapshot.key}`)
+ .update({
+ cloneSessionID: cloneSessionID
+ });
+ return true;
+ }
+ });
+ })
+ .catch(e => {
+ console.log(e);
+ });
+
+ return true;
+ }
+
+ });
+
+ });
+ }
+
+ }
+
+ })
+ .catch(e => {
+ console.log(e);
+ });
+
+ });
+
+ // 'send-clone' button functionality
+ // executes when 'send-clone' button is clicked
+ // i.e. when 'cloneTrigger' key is changed in database
+ database()
+ .ref(`code-sessions/${session_id}/cloneHelper/cloneTrigger`)
+ .on('value', snapshot => {
+
+ database()
+ .ref(`code-sessions/${session_id}/cloneHelper`)
+ .once("value")
+ .then(snapshot => {
+ let isFirstLoad = snapshot.val().isFirstLoad;
+
+ // does not execute on first load of page
+ if(isFirstLoad === false){
+
+ // console.log("sendCloneButton clicked!");
+
+ date = Date();
+
+ // fetching existing code in this session ID to be cloned
+ var existingContent;
+ database()
+ .ref(`code-sessions/${session_id}`)
+ .once("value")
+ .then(snapshot => {
+ existingContent = snapshot.val().content;
+ })
+ .catch(e => {
+ console.log(e);
+ });
+
+ // only creator can create new sessions with cloned code
+ if(this.state.isCreator){
+
+ database()
+ .ref(`code-sessions/${session_id}/users-connected`)
+ .once("value")
+ .then(snapshot => {
+ // console.log("New clone being created.");
+
+ snapshot.forEach(function(childSnapshot){
+
+ // console.log(existingContent);
+ let newSessionKey = random.generate(5);
+ let userData = childSnapshot.val();
+
+ // creating new session with cloned code
+ database()
+ .ref("code-sessions/" + newSessionKey)
+ .set({
+ cloneSentBy: creator_uid,
+ content: existingContent,
+ createdon: date,
+ readOnly: false,
+ });
+
+ // adding details of the user as creator to the database
+ database()
+ .ref("code-sessions/" + newSessionKey + "/creator")
+ .set({
+ user_id: userData.user_id,
+ user_name: userData.user_name,
+ user_email: userData.user_email,
+ user_photo: userData.user_photo
+ });
+
+ });
+
+ // setting 'numOfClonesCreated' to be passed in props of 'CloneSendPopup'
+ clonesCreated.numOfClonesCreated = snapshot.numChildren();
+ console.log(`Created ${snapshot.numChildren()} clone(s)`);
+
+ })
+ .catch(e => {
+ console.log(e);
+ });
+ }
+
+ // finding new session id with cloned content
+ // for currently signed-in user
+ // and storing that session id in 'newCloneSessionID' object
+ if(!this.state.isCreator){
+
+ // console.log(date);
+ // comparing date of session created exluding the 'seconds' time
+ var dateCompressed = date.substring(0, 21);
+
+ database()
+ .ref(`code-sessions/`)
+ .once("value")
+ .then(snapshot => {
+
+ snapshot.forEach(function(childSnapshot){
+
+ console.clear();
+ console.log("Searching...");
+
+ let cloneSentBy = childSnapshot.child("cloneSentBy").val();
+ let user_id = childSnapshot.child("creator").child("user_id").val();
+ let content = childSnapshot.child("content").val();
+ let createdOn = childSnapshot.child("createdon").val();
+ let createdOnCompressed = createdOn.substring(0, 21);
+
+ // Comparing: content (code), user id (uid),
+ // cloneSentBy (creator id), date (createOn)
+ if(cloneSentBy === creator_uid
+ && user_id === user.uid
+ && content === existingContent
+ && createdOnCompressed === dateCompressed) {
+
+ let cloneSessionID = childSnapshot.key;
+ newCloneSessionID.session_id = cloneSessionID;
+ console.log(`Clone found at session ID: ${cloneSessionID} \n`);
+
+ userConnectedRef
+ .once("value")
+ .then(snapshot => {
+ snapshot.forEach(function(childSnapshot){
+ let user_id = childSnapshot.val().user_id;
+ if(user_id === user.uid) {
+ console.log(`User details stored under "${childSnapshot.key}" in database`);
+ database()
+ .ref(`code-sessions/${session_id}/users-connected/${childSnapshot.key}`)
+ .update({
+ cloneSessionID: cloneSessionID
+ });
+ return true;
+ }
+ });
+ })
+ .catch(e => {
+ console.log(e);
+ });
+
+ return true;
+ }
+ });
+
+ });
+ }
+
+ }
+
+ })
+ .catch(e => {
+ console.log(e);
+ });
+
+ });
+
+ } else {
+ console.log("Cannot fetch currently signed-in user!");
+ }
+ } catch(error) {
+ console.log("Error in authentication:", error);
+ }
+ });
+
+ this.codeRef = database().ref(`code-sessions/${session_id}`);
+
+ };
+
+ // single user 'send-clone' button handler
+ sendSingleCloneHandler = (e) => {
+
+ let user_uid = e.currentTarget.value;
+ // console.log(user_uid);
+
+ let newCloneTrigger = random.generate(3);
+ this.setState({
+ clonePopupShowSingle: true,
+ cloneTrigger: newCloneTrigger,
+ });
+
+ // adding corresponding user uid into database
+ this.codeRef.child("singleCloneHelper").child("user_uid").set(user_uid);
+ // setting 'isFirstLoad' to false in database
+ this.codeRef.child("singleCloneHelper").child("isFirstLoad").set(false);
+ // setting 'clonePopupShow' state to true in database
+ this.codeRef.child("singleCloneHelper").child("clonePopupShow").set(true);
+ // updating 'cloneTrigger' value and 'clonePopupShow' state in database
+ // indicating 'send-clone' button is clicked
+ this.codeRef.child("singleCloneHelper").child("cloneTrigger").set(newCloneTrigger);
+
+ };
+
+ // 'send-clone' button handler
+ sendCloneHandler = () => {
+ let newCloneTrigger = random.generate(3);
+ this.setState({
+ clonePopupShow: true,
+ cloneTrigger: newCloneTrigger,
+ });
+ // setting 'isFirstLoad' to false in database
+ this.codeRef.child("cloneHelper").child("isFirstLoad").set(false);
+ // setting 'clonePopupShow' state to true in database
+ this.codeRef.child("cloneHelper").child("clonePopupShow").set(true);
+ // updating 'cloneTrigger' value and 'clonePopupShow' state in database
+ // indicating 'send-clone' button is clicked
+ this.codeRef.child("cloneHelper").child("cloneTrigger").set(newCloneTrigger);
+ };
+
render() {
+
+ // 'send-clone' button is only displayed when current user is the creator of session
+ let sendCloneButton;
+ if (this.state.isCreator) {
+ sendCloneButton =
+
+
+ {/* */}
+ Send Clone To All
+
+
+ }
+
+ // to close the send/receive clone popup
+ let clonePopupClose = () => {
+ this.setState({clonePopupShow: false});
+ this.setState({clonePopupShowSingle: false});
+ }
+
+ let clonePopUp;
+ if (!this.state.isCreator) {
+ // render 'clone-received' pop-up component
+ clonePopUp =
+
+ } else {
+ // render 'clone-sent' pop-up component
+ clonePopUp =
+
+ }
+
+ let singleClonePopUp;
+ if (this.state.isCreator) {
+ // render 'clone-sent' pop-up (for single user) component
+ singleClonePopUp =
+
+ }
let drawerClasses = 'side-drawer';
-
if (this.props.show) {
drawerClasses = 'side-drawer open';
}
@@ -24,9 +658,16 @@ export default class sideDrawer extends React.Component {
{creatorInfo.user_name}
+
+ { sendCloneButton }
+
Connected Users:
+
+ { clonePopUp }
+ { singleClonePopUp }
+
{ usersList }
@@ -35,4 +676,7 @@ export default class sideDrawer extends React.Component {
);
}
-}
\ No newline at end of file
+}
+
+// exporting new session ID with cloned code to each user-connected
+export {newCloneSessionID};
\ No newline at end of file
From 1d3bb9f17c0f9ae4a466069f274e35cb7685a59e Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 7 Apr 2020 12:31:30 +0530
Subject: [PATCH 19/51] improve sidebar styling
---
src/components/SideDrawer/SideDrawer.css | 159 +++++++++++++++++++++++
1 file changed, 159 insertions(+)
create mode 100644 src/components/SideDrawer/SideDrawer.css
diff --git a/src/components/SideDrawer/SideDrawer.css b/src/components/SideDrawer/SideDrawer.css
new file mode 100644
index 0000000..0f53982
--- /dev/null
+++ b/src/components/SideDrawer/SideDrawer.css
@@ -0,0 +1,159 @@
+.side-drawer {
+ height: 100%;
+ background: white;
+ box-shadow: 1px 0px 7px rgba(0, 0, 0, 0.5);
+ position: fixed;
+ top: 0;
+ /* left: 0; */
+ right: 0;
+ width: 70%;
+ max-width: 300px;
+ z-index: 200;
+ /* transform: translateX(-100%); */
+ transform: translateX(100%);
+ transition: transform 0.3s ease-out;
+ overflow: auto;
+}
+
+.side-drawer.open {
+ transform: translateX(0);
+}
+
+.side-drawer .heading {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-top: 8px;
+ padding: 6px 0px;
+ color: #000000;
+ font-size: 1.2rem;
+ text-decoration: none;
+ vertical-align: center;
+}
+
+.side-drawer .divider {
+ margin: 8px auto;
+ height: 1px;
+ width: 80%;
+ background-color: #757575;
+}
+
+.side-drawer .divider-thick {
+ margin: 18px auto;
+ height: 2px;
+ width: 90%;
+ background-color: #423939cc;
+}
+
+.side-drawer .creator-info {
+ display: flex;
+ align-items: center;
+ margin: 3px 0;
+ padding: 0 40px;
+}
+
+.side-drawer .creator-info img {
+ height: 2.3rem;
+ width: 2.3rem;
+ border-radius: 50%;
+ border: 1px solid #222;
+}
+
+.side-drawer .creator-info span {
+ color: #000000;
+ font-size: 1rem;
+ margin-left: 10px;
+}
+
+.side-drawer ul {
+ margin: 0;
+ padding: 0 40px;
+ height: 75%;
+ list-style: none;
+ display: flex;
+ flex-direction: column;
+}
+
+.side-drawer ul li {
+ margin: 3px 0;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.side-drawer ul li img {
+ height: 2.3rem;
+ width: 2.3rem;
+ border-radius: 50%;
+ border: 1px solid #222;
+ margin: auto;
+}
+
+.side-drawer ul .user-details-list {
+ color: #000000;
+ font-size: 1rem;
+ display: flex;
+}
+
+.side-drawer ul li span .user-name {
+ color: #000000;
+ font-size: 1rem;
+ margin: auto;
+ margin-left: 10px;
+}
+
+.side-drawer ul li .single-clone-btn {
+ margin: 0;
+ font-size: 0.85rem;
+}
+
+.side-drawer ul li span:hover {
+ color: #800000;
+ cursor: default;
+}
+
+.side-drawer ul li a {
+ text-decoration: none;
+ color: #000000;
+ font-size: 1rem;
+ margin: auto;
+ margin-left: 10px;
+}
+
+.side-drawer ul li a:hover {
+ color: #800000;
+ cursor: default;
+}
+
+.side-drawer .btn-sendClone {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-top: -14px;
+ height: 30px;
+ background-color: #323030;
+ color: #e4e4e4;
+ font-size: 14px;
+ border: 1px solid black;
+ border-radius: 4px;
+ padding: 0 8px;
+ line-height: 30px;
+ -webkit-transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
+ -o-transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
+ transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
+}
+
+.btn-sendClone:hover {
+ background: #5ce198;
+ color: black;
+}
+
+.btn-sendClone:focus {
+ outline: none;
+}
+
+/* @media (min-width: 769px) {
+ .side-drawer {
+ display: none;
+ }
+} */
\ No newline at end of file
From 9576374d01bcb3141dc25c1570d0445242dac6f6 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 7 Apr 2020 12:34:49 +0530
Subject: [PATCH 20/51] add lang dropdown menu & move clone btn to sidebar
---
src/containers/pages/Coding.js | 279 ++++-----------------------------
1 file changed, 29 insertions(+), 250 deletions(-)
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index 6e81f88..a3a803e 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -4,19 +4,20 @@ import CodeMirror from "react-codemirror";
import Header from "../../components/Header/Header";
import SideDrawer from '../../components/SideDrawer/SideDrawer';
import Backdrop from '../../components/Backdrop/Backdrop';
-import CloneReceivePopUp from '../../components/ClonePopup/CloneReceivePopUp';
-import CloneSendPopup from '../../components/ClonePopup/CloneSendPopup';
import { database } from "firebase/app";
import { firebaseAuth } from "../../config/firebase-config";
import { logout } from "../../helpers/auth";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { faBars, faFileExport } from '@fortawesome/free-solid-svg-icons';
+import { faBars } from '@fortawesome/free-solid-svg-icons';
import { faToggleOn, faToggleOff } from '@fortawesome/free-solid-svg-icons';
import "codemirror/lib/codemirror";
import "codemirror/lib/codemirror.css";
import 'codemirror/mode/xml/xml';
+import 'codemirror/mode/markdown/markdown';
import "codemirror/mode/javascript/javascript";
+import "codemirror/mode/clike/clike";
+import "codemirror/mode/python/python";
import "codemirror/theme/dracula.css";
import 'codemirror/addon/edit/closetag';
import 'codemirror/addon/edit/matchbrackets';
@@ -30,10 +31,7 @@ import 'codemirror/addon/comment/comment';
const appTokenKey = "appToken";
const sessionID = "sessionID";
-const usersList = [];
const creatorInfo = {};
-const newCloneSessionID = {};
-const clonesCreated = {};
export default class CodingPage extends React.Component {
@@ -53,11 +51,10 @@ export default class CodingPage extends React.Component {
// setting initial state
this.state = {
key: random.generate(3), // for storing connected-users
- cloneTrigger: random.generate(3), // for triggering clone feature
readOnly: false,
isCreator: false,
sideDrawerOpen: false,
- clonePopupShow: false,
+ mode: 'markdown',
code: "Loading...",
cursorPosition: {
line: 0,
@@ -84,7 +81,7 @@ export default class CodingPage extends React.Component {
// setting initial state
state = {
sideDrawerOpen: false,
- clonePopupShow: false,
+ mode: 'markdown',
code: "Loading...",
cursorPosition: {
line: 0,
@@ -173,36 +170,6 @@ export default class CodingPage extends React.Component {
this.setState({ isCreator: true });
}
- // setting states of 'cloneTrigger' & 'isFirstLoad' in database
- database()
- .ref(`code-sessions/${session_id}/cloneHelper`)
- .update({
- cloneTrigger: this.state.cloneTrigger,
- isFirstLoad: true,
- });
-
- // displaying users-connected from database
- database()
- .ref(`code-sessions/${params.sessionid}/users-connected`)
- .on('value', snapshot => {
- clonesCreated.numOfClonesCreated = snapshot.numChildren();
- console.log("\nConnected users: ");
- usersList.splice(0, usersList.length);
- var i = 0;
- snapshot.forEach(function(childSnapshot){
- var userData = childSnapshot.val();
- console.log(userData.user_name + " - " + userData.user_email);
- usersList.push(
-
-
- {userData.user_name}
-
- );
- i++;
- });
- console.log("\n");
- });
-
// making the users-editing-state button dynamic
database()
.ref(`code-sessions/${params.sessionid}`)
@@ -218,156 +185,6 @@ export default class CodingPage extends React.Component {
}
});
- // 'received-clone' pop-up handler
- if(!this.state.isCreator){
- // fetching and then setting state of 'clonePopupShow' from database
- database()
- .ref(`code-sessions/${params.sessionid}/cloneHelper/clonePopupShow`)
- .on('value', snapshot => {
- // console.log("'clonePopupShow' state changed!");
- let clonePopupShowState = snapshot.val();
- if(clonePopupShowState){
- this.setState({
- clonePopupShow: true,
- });
- }
-
- // setting state of 'clonePopupShow' to false in database
- // after delay of 500 milliseconds
- function clonePopupShowStateDelay(){
- database()
- .ref(`code-sessions/${params.sessionid}/cloneHelper/clonePopupShow`)
- .set(false);
- }
- setTimeout(clonePopupShowStateDelay, 500);
-
- });
- }
-
- var date;
-
- // 'send-clone' button functionality
- // executes when 'send-clone' button is clicked
- // i.e. when 'cloneTrigger' key is changed in database
- database()
- .ref(`code-sessions/${params.sessionid}/cloneHelper/cloneTrigger`)
- .on('value', snapshot => {
-
- database()
- .ref(`code-sessions/${session_id}/cloneHelper`)
- .once("value")
- .then(snapshot => {
- let isFirstLoad = snapshot.val().isFirstLoad;
-
- // does not execute on first load of page
- if(isFirstLoad === false){
-
- // console.log("sendCloneButton clicked!");
-
- date = Date();
-
- // fetching existing code in this session ID to be cloned
- var existingContent;
- database()
- .ref(`code-sessions/${session_id}`)
- .once("value")
- .then(snapshot => {
- existingContent = snapshot.val().content;
- })
- .catch(e => {
- console.log(e);
- });
-
- // only creator can create new sessions with cloned code
- if(this.state.isCreator){
-
- database()
- .ref(`code-sessions/${session_id}/users-connected`)
- .once("value")
- .then(snapshot => {
- // console.log("New clone being created.");
-
- snapshot.forEach(function(childSnapshot){
-
- // console.log(existingContent);
- let newSessionKey = random.generate(5);
- let userData = childSnapshot.val();
-
- // creating new session with cloned code
- database()
- .ref("code-sessions/" + newSessionKey)
- .set({
- cloneSentBy: creator_uid,
- content: existingContent,
- createdon: date,
- readOnly: false,
- });
-
- // adding details of the user as creator to the database
- database()
- .ref("code-sessions/" + newSessionKey + "/creator")
- .set({
- user_id: userData.user_id,
- user_name: userData.user_name,
- user_email: userData.user_email,
- user_photo: userData.user_photo
- });
-
- });
-
- // setting 'numOfClonesCreated' to be passed in props of 'CloneSendPopup'
- clonesCreated.numOfClonesCreated = snapshot.numChildren();
- console.log(`Created ${snapshot.numChildren()} clone(s)`);
-
- })
- .catch(e => {
- console.log(e);
- });
- }
-
- // finding new session id with cloned content
- // for currently signed-in user
- // and storing that session id in 'newCloneSessionID' object
- if(!this.state.isCreator){
-
- // console.log(date);
- // comparing date of session created exluding the 'seconds' time
- var dateCompressed = date.substring(0, 21);
-
- database()
- .ref(`code-sessions/`)
- .on('value', snapshot => {
- snapshot.forEach(function(childSnapshot){
-
- let cloneSentBy = childSnapshot.child("cloneSentBy").val();
- let user_id = childSnapshot.child("creator").child("user_id").val();
- let content = childSnapshot.child("content").val();
- let createdOn = childSnapshot.child("createdon").val();
- let createdOnCompressed = createdOn.substring(0, 21);
-
- // Comparing: content (code), user id (uid),
- // cloneSentBy (creator id), date (createOn)
- if(cloneSentBy === creator_uid
- && user_id === user.uid
- && content === existingContent
- && createdOnCompressed === dateCompressed) {
-
- let cloneSessionID = childSnapshot.key;
- newCloneSessionID.session_id = cloneSessionID;
- // console.log(`Clone found at session ID: ${cloneSessionID} \n`);
- return true;
- }
- });
-
- })
- }
-
- }
-
- })
-
- });
-
} else {
console.log("Cannot fetch currently signed-in user!");
}
@@ -475,21 +292,13 @@ export default class CodingPage extends React.Component {
this.codeRef.child("readOnly").set(!this.state.readOnly);
};
- // 'send-clone' button handler
- sendCloneHandler = () => {
- let newCloneTrigger = random.generate(3);
- this.setState({
- clonePopupShow: true,
- cloneTrigger: newCloneTrigger,
- });
- // setting 'isFirstLoad' to false in database
- this.codeRef.child("cloneHelper").child("isFirstLoad").set(false);
- // setting 'clonePopupShow' state to true in database
- this.codeRef.child("cloneHelper").child("clonePopupShow").set(true);
- // updating 'cloneTrigger' value and 'clonePopupShow' state in database
- // indicating 'send-clone' button is clicked
- this.codeRef.child("cloneHelper").child("cloneTrigger").set(newCloneTrigger);
- };
+ // editor language handler
+ changeMode = (e) => {
+ var mode = e.target.value;
+ this.setState({
+ mode: mode
+ });
+ };
render() {
@@ -511,17 +320,6 @@ export default class CodingPage extends React.Component {
}
- // 'send-clone' button is only displayed when current user is the creator of session
- let sendCloneButton;
- if (this.state.isCreator) {
- sendCloneButton =
-
-
-
- }
-
// this button is only displayed to the users-connected (not the creator)
let userEditingToggle;
if (!this.state.isCreator) {
@@ -538,30 +336,6 @@ export default class CodingPage extends React.Component {
}
- // to close the send/receive clone popup
- let clonePopupClose = () => {
- this.setState({clonePopupShow: false});
- }
-
- let clonePopUp;
- if (!this.state.isCreator) {
- // render 'clone-received' pop-up component
- clonePopUp =
-
- } else {
- // render 'clone-sent' pop-up component
- clonePopUp =
-
- }
-
return (
@@ -572,12 +346,25 @@ export default class CodingPage extends React.Component {
{this.state.createdon
? `Created On: ${this.state.createdon}`
: ""}
- { sendCloneButton }
+
+
+ Markdown
+ JavaScript
+ C
+ C++
+ Java
+ Python
+
+
{ readOnlyToggle }
{ userEditingToggle }
+
Sign Out
+
@@ -585,8 +372,6 @@ export default class CodingPage extends React.Component {
}
/>
- { clonePopUp }
-
{ backdrop }
@@ -597,7 +382,7 @@ export default class CodingPage extends React.Component {
value={this.state.code}
onChange={this.onChange}
options={{
- mode: "xml",
+ mode: this.state.mode,
theme: "dracula",
lineNumbers: true,
autoCloseTags: true,
@@ -619,11 +404,5 @@ export default class CodingPage extends React.Component {
}
-// exporting connected-users list
-export {usersList};
-
// exporting creator info object
-export {creatorInfo};
-
-// exporting new session ID with cloned code to each user-connected
-export {newCloneSessionID};
\ No newline at end of file
+export {creatorInfo};
\ No newline at end of file
From 1ddcc450be532c8a12c991608236451297fe8adf Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 7 Apr 2020 12:36:26 +0530
Subject: [PATCH 21/51] improve language dropdown menu styling
---
src/containers/App.css | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/containers/App.css b/src/containers/App.css
index c3e02a4..dde062e 100644
--- a/src/containers/App.css
+++ b/src/containers/App.css
@@ -237,6 +237,11 @@ p {
/**** Extra ****/
+.mode-dropdown {
+ height: 30px;
+ font-size: 13px;
+}
+
.toggle-btn {
vertical-align: bottom;
font-size: 1.4rem;
From f2dfed9956859a377bd1041b92fef672f3bf15b8 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 7 Apr 2020 12:49:39 +0530
Subject: [PATCH 22/51] fix session create button
---
src/containers/pages/Home.js | 51 ++++++++++++++++++++++--------------
1 file changed, 31 insertions(+), 20 deletions(-)
diff --git a/src/containers/pages/Home.js b/src/containers/pages/Home.js
index b3eb9c6..9b26bea 100644
--- a/src/containers/pages/Home.js
+++ b/src/containers/pages/Home.js
@@ -43,28 +43,39 @@ export default class HomePage extends React.Component {
// when new session is created ('Share Code' button is clicked)
onNewGround = () => {
- var user = firebaseAuth().currentUser;
-
- database()
- .ref("code-sessions/" + this.state.key)
- .set({
- content: " I ♥ Coding! ",
- createdon: Date(),
- readOnly: false, // by default 'false'
- });
-
- // adding details of the user to the database
- database()
- .ref("code-sessions/" + this.state.key + "/creator")
- .set({
- user_id: user.uid,
- user_name: user.displayName,
- user_email: user.email,
- user_photo: user.photoURL
+ // to fetch currently signed-in user
+ firebaseAuth().onAuthStateChanged((user) => {
+ try {
+ if (user) {
+
+ database()
+ .ref("code-sessions/" + this.state.key)
+ .set({
+ content: " I ♥ Coding! ",
+ createdon: Date(),
+ readOnly: false, // by default 'false'
+ });
+
+ // adding details of the user to the database
+ database()
+ .ref("code-sessions/" + this.state.key + "/creator")
+ .set({
+ user_id: user.uid,
+ user_name: user.displayName,
+ user_email: user.email,
+ user_photo: user.photoURL
+ });
+
+ this.props.history.push("/home/" + this.state.key);
+
+ } else {
+ console.log("Cannot fetch currently signed-in user!");
+ }
+ } catch(error) {
+ console.log("Error in authentication:", error);
+ }
});
- this.props.history.push("/home/" + this.state.key);
-
};
// sign-out functionality
From cbd4a3fdbadb5765ff05df85dc62d827254e472a Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 7 Apr 2020 13:12:16 +0530
Subject: [PATCH 23/51] fix new session not creating bug
---
src/containers/pages/Home.js | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/containers/pages/Home.js b/src/containers/pages/Home.js
index 9b26bea..c39c134 100644
--- a/src/containers/pages/Home.js
+++ b/src/containers/pages/Home.js
@@ -44,7 +44,8 @@ export default class HomePage extends React.Component {
onNewGround = () => {
// to fetch currently signed-in user
- firebaseAuth().onAuthStateChanged((user) => {
+ firebaseAuth().onAuthStateChanged(user => {
+ // firebaseAuth().onIdTokenChanged(user => {
try {
if (user) {
@@ -70,6 +71,8 @@ export default class HomePage extends React.Component {
} else {
console.log("Cannot fetch currently signed-in user!");
+ console.log("Signing out... please login again.");
+ this.handleLogout();
}
} catch(error) {
console.log("Error in authentication:", error);
From 8564449e34960e29df6df16b8abc5a763e02be89 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 7 Apr 2020 13:25:24 +0530
Subject: [PATCH 24/51] fix user auth state bug
---
src/containers/pages/Coding.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index a3a803e..6a2e9ec 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -187,6 +187,8 @@ export default class CodingPage extends React.Component {
} else {
console.log("Cannot fetch currently signed-in user!");
+ console.log("Signing out... please login again.");
+ this.handleLogout();
}
} catch(error) {
console.log("Error in authentication:", error);
From 4e53be37c2c95ade4c56dc9f4aee76f681ee2df8 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 7 Apr 2020 13:52:49 +0530
Subject: [PATCH 25/51] fix session redirect when logged out bug
---
.firebase/hosting.YnVpbGQ.cache | 34 ++++++++++++++++-----------------
src/containers/pages/Coding.js | 11 ++++++++++-
2 files changed, 27 insertions(+), 18 deletions(-)
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
index d55c682..33e90d1 100644
--- a/.firebase/hosting.YnVpbGQ.cache
+++ b/.firebase/hosting.YnVpbGQ.cache
@@ -1,17 +1,17 @@
-asset-manifest.json,1585379384399,5f1acfdb8f91f5df51e2a63b3b4ed2d8b4329471d532666ced64bc01df579cfe
-index.html,1585379384395,7c14b9a6f0a46c22aa933410f7859495986932f50e635103ccc535a9b1ec8917
-precache-manifest.7a60d5a85af2390dc1e080088cd2ae17.js,1585379384395,1a928a2cf49b2b8cb54960b513d8604a591c8acf6ec70428237acb9734baf4fa
-service-worker.js,1585379384395,9412fc08ce2ee5f28ff6c1e6bb63bf1cb44effd6b860ea15a123f2b784ef80eb
-static/css/main.526481a2.chunk.css,1585379384434,6c94f2728d2171c0bfcba02645ffed573844e225b7e5932489238c4cd4671c66
-static/css/main.526481a2.chunk.css.map,1585379384434,89d1643ddb7230149d9e570d6ce96418bc956b2e977a93878f25becc62b35842
-static/js/2.72309e5d.chunk.js.LICENSE.txt,1585379384437,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-static/js/main.e2c833e9.chunk.js,1585379384434,ec9ff036d58f04fe425ed445e450592971a4cd72eca1114f463aa493199c4ed0
-static/js/runtime-main.e13d1eff.js,1585379384437,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-static/js/runtime-main.e13d1eff.js.map,1585379384440,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/media/CNLOGO.c149ff8b.svg,1585379384434,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-favicon_CN.ico,1585379354230,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/js/main.e2c833e9.chunk.js.map,1585379384437,29a6674f4346c387af32b31073e544344fc4391bc32c2163d35cf56ebc8bdc22
-static/css/2.918a5898.chunk.css,1585379384396,32b8d2f30d1ddc5a96ca009ec979dc5955f8e6ab686e92effe43431d8ca75613
-static/css/2.918a5898.chunk.css.map,1585379384435,5c6cabc6d428b62a1ae4417b0816785f7e933f56156cc7be0475f8bf87583f84
-static/js/2.72309e5d.chunk.js,1585379384437,59c6a7dbb63f9ef46c71d39c3a78e38a2367cae8392e98d530864e4aaa517c9a
-static/js/2.72309e5d.chunk.js.map,1585379384436,015bee67830d89b059201c60bc8d0a8ff7a82b8c0f207025acaddf5b3703aa55
+asset-manifest.json,1586246464349,03e41d88536136c8841af160fce13b9504ecac630df634ee03846aebd8a4dee9
+index.html,1586246464307,fa599204992830c4afc2595086cb939e7049c4e51c4ba98cb1a7c3596f36bfa7
+precache-manifest.25bfcc28d08ab79accccec908df466c4.js,1586246464307,4b661a84fc37712fb9862150ea73f3567f924e8c04ebec35c01d5d182c4e163b
+service-worker.js,1586246464307,1e1043ef751bd150600bdc359e84a478a9cd3d91c87d80213a68fd9244a62f46
+static/css/main.792b9d28.chunk.css,1586246464309,d207b75e4ebf91870b8de3543a5332bff773a9b6a6ea36d91a3d9fce16fed9b6
+static/js/2.08da8f75.chunk.js.LICENSE.txt,1586246464349,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
+static/css/main.792b9d28.chunk.css.map,1586246464351,48cfa21cfe6d69e5e2a6957423524c48beb65cb0ef09af2096d1d9d4ad87e4b6
+static/js/main.10e976ff.chunk.js,1586246464351,e6f87c4bda6759450ce14d3c5fe81b7478015f870c7f17aae0e1efe117152596
+static/js/runtime-main.e13d1eff.js,1586246464308,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
+favicon_CN.ico,1586246448410,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
+static/js/runtime-main.e13d1eff.js.map,1586246464349,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
+static/media/CNLOGO.c149ff8b.svg,1586246464309,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
+static/js/main.10e976ff.chunk.js.map,1586246464351,8b8421df4011462101c5a1bf785447ebcc47c51cb904ce854422b498ef90a715
+static/css/2.918a5898.chunk.css,1586246464349,32b8d2f30d1ddc5a96ca009ec979dc5955f8e6ab686e92effe43431d8ca75613
+static/css/2.918a5898.chunk.css.map,1586246464349,5c6cabc6d428b62a1ae4417b0816785f7e933f56156cc7be0475f8bf87583f84
+static/js/2.08da8f75.chunk.js,1586246464351,d1d8c3ffaceb0cc976eda96b9baab008c4a088a08fc2740329b21b59a613e738
+static/js/2.08da8f75.chunk.js.map,1586246464350,85a7ad37ea483a1f69dbba932b0e2f171776f68ae51a7c0de76c345b172798bb
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index 6a2e9ec..8dd527f 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -186,9 +186,18 @@ export default class CodingPage extends React.Component {
});
} else {
+
console.log("Cannot fetch currently signed-in user!");
console.log("Signing out... please login again.");
- this.handleLogout();
+ if (localStorage.getItem(appTokenKey)) {
+ localStorage.setItem("sessionID", session_id);
+ logout().then(function () {
+ localStorage.removeItem(appTokenKey);
+ this.props.history.push("/login");
+ }.bind(this));
+ return;
+ }
+
}
} catch(error) {
console.log("Error in authentication:", error);
From cc03d692367e4a47b1aed126bf838e6f81015aa8 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Sun, 12 Apr 2020 23:40:57 +0530
Subject: [PATCH 26/51] display user presence status in sidebar
---
.firebase/hosting.YnVpbGQ.cache | 34 +++++++++----------
src/components/SideDrawer/SideDrawer.css | 22 +++++++++++++
src/components/SideDrawer/SideDrawer.js | 42 ++++++++++++++++++++++++
3 files changed, 81 insertions(+), 17 deletions(-)
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
index 33e90d1..a4a323c 100644
--- a/.firebase/hosting.YnVpbGQ.cache
+++ b/.firebase/hosting.YnVpbGQ.cache
@@ -1,17 +1,17 @@
-asset-manifest.json,1586246464349,03e41d88536136c8841af160fce13b9504ecac630df634ee03846aebd8a4dee9
-index.html,1586246464307,fa599204992830c4afc2595086cb939e7049c4e51c4ba98cb1a7c3596f36bfa7
-precache-manifest.25bfcc28d08ab79accccec908df466c4.js,1586246464307,4b661a84fc37712fb9862150ea73f3567f924e8c04ebec35c01d5d182c4e163b
-service-worker.js,1586246464307,1e1043ef751bd150600bdc359e84a478a9cd3d91c87d80213a68fd9244a62f46
-static/css/main.792b9d28.chunk.css,1586246464309,d207b75e4ebf91870b8de3543a5332bff773a9b6a6ea36d91a3d9fce16fed9b6
-static/js/2.08da8f75.chunk.js.LICENSE.txt,1586246464349,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-static/css/main.792b9d28.chunk.css.map,1586246464351,48cfa21cfe6d69e5e2a6957423524c48beb65cb0ef09af2096d1d9d4ad87e4b6
-static/js/main.10e976ff.chunk.js,1586246464351,e6f87c4bda6759450ce14d3c5fe81b7478015f870c7f17aae0e1efe117152596
-static/js/runtime-main.e13d1eff.js,1586246464308,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-favicon_CN.ico,1586246448410,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/js/runtime-main.e13d1eff.js.map,1586246464349,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/media/CNLOGO.c149ff8b.svg,1586246464309,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-static/js/main.10e976ff.chunk.js.map,1586246464351,8b8421df4011462101c5a1bf785447ebcc47c51cb904ce854422b498ef90a715
-static/css/2.918a5898.chunk.css,1586246464349,32b8d2f30d1ddc5a96ca009ec979dc5955f8e6ab686e92effe43431d8ca75613
-static/css/2.918a5898.chunk.css.map,1586246464349,5c6cabc6d428b62a1ae4417b0816785f7e933f56156cc7be0475f8bf87583f84
-static/js/2.08da8f75.chunk.js,1586246464351,d1d8c3ffaceb0cc976eda96b9baab008c4a088a08fc2740329b21b59a613e738
-static/js/2.08da8f75.chunk.js.map,1586246464350,85a7ad37ea483a1f69dbba932b0e2f171776f68ae51a7c0de76c345b172798bb
+asset-manifest.json,1586247811631,3696ff9edf6549560d2838418340c55999f4e06dae5530c918e68138d53c8558
+index.html,1586247811590,e9e8d9bc0d01139e36f2701934a336093336462c5c9a2da05b9c077bda9119d3
+precache-manifest.7a6f988679ff96b953e558efea156cb7.js,1586247811590,74b2c79822e35f4fb9bab7c044fc642bbb7b4766c27224603ae9d2104c8762fc
+service-worker.js,1586247811590,7c9063040f8e16ffec2178f657859647c42055c8b1750a76d7addfff4e972168
+static/css/main.792b9d28.chunk.css,1586247811633,d207b75e4ebf91870b8de3543a5332bff773a9b6a6ea36d91a3d9fce16fed9b6
+static/js/2.4c74b29d.chunk.js.LICENSE.txt,1586247811632,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
+static/css/main.792b9d28.chunk.css.map,1586247811632,48cfa21cfe6d69e5e2a6957423524c48beb65cb0ef09af2096d1d9d4ad87e4b6
+static/js/main.73193553.chunk.js,1586247811635,0515bd048af9659df3a3a9590f2f2665c9ad28526a1954591774d463d16bdd7c
+favicon_CN.ico,1586247779775,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
+static/js/runtime-main.e13d1eff.js,1586247811590,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
+static/js/runtime-main.e13d1eff.js.map,1586247811635,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
+static/media/CNLOGO.c149ff8b.svg,1586247811590,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
+static/js/main.73193553.chunk.js.map,1586247811635,31be371a8fde559f78f8c1a5a5de07be7bd6b6a6a6f1c04362a10e1218aaebff
+static/css/2.918a5898.chunk.css,1586247811591,32b8d2f30d1ddc5a96ca009ec979dc5955f8e6ab686e92effe43431d8ca75613
+static/css/2.918a5898.chunk.css.map,1586247811634,5c6cabc6d428b62a1ae4417b0816785f7e933f56156cc7be0475f8bf87583f84
+static/js/2.4c74b29d.chunk.js,1586247811634,93f4d8a2c38e30c120309f4c7574a67f214e0fcbd6e1ae67f3962b2a0412ec9c
+static/js/2.4c74b29d.chunk.js.map,1586247811633,04644b0a3c2d528864bebc895b5468c5dfd295d4f4ac88f6b794ed3cda211f5b
diff --git a/src/components/SideDrawer/SideDrawer.css b/src/components/SideDrawer/SideDrawer.css
index 0f53982..381f260 100644
--- a/src/components/SideDrawer/SideDrawer.css
+++ b/src/components/SideDrawer/SideDrawer.css
@@ -152,6 +152,28 @@
outline: none;
}
+.green-dot {
+ background-color: #41d641;
+ height: 10px;
+ width: 10px;
+ display: flex;
+ margin: auto;
+ margin-right: 10px;
+ margin-left: -20px;
+ border-radius: 50%;
+}
+
+.red-dot {
+ background-color: #F44336;
+ height: 10px;
+ width: 10px;
+ display: flex;
+ margin: auto;
+ margin-right: 10px;
+ margin-left: -20px;
+ border-radius: 50%;
+}
+
/* @media (min-width: 769px) {
.side-drawer {
display: none;
diff --git a/src/components/SideDrawer/SideDrawer.js b/src/components/SideDrawer/SideDrawer.js
index a09e725..ad1b0a4 100644
--- a/src/components/SideDrawer/SideDrawer.js
+++ b/src/components/SideDrawer/SideDrawer.js
@@ -91,6 +91,33 @@ export default class sideDrawer extends React.Component {
isFirstLoad: true,
});
+ // for updating user's presence status
+ database()
+ .ref(`code-sessions/${session_id}/users-connected`)
+ .on('value', snapshot => {
+ snapshot.forEach(function(childSnapshot){
+ var userData = childSnapshot.val();
+ if(user.uid === userData.user_id){
+ let userKey = childSnapshot.key;
+ let userRef = database().ref(`code-sessions/${session_id}/users-connected/${userKey}/user_status`)
+ // monitor connection state on browser tab
+ database().ref(".info/connected")
+ .on("value", snapshot => {
+ let userStatus = snapshot.val();
+ if(userStatus) {
+ // set user's online status
+ userRef.onDisconnect().set('offline');
+ userRef.set('online');
+ // console.log("User: ONLINE");
+ } else {
+ // client has lost network
+ // console.log("User: OFFLINE");
+ }
+ });
+ }
+ });
+ });
+
// displaying users-connected from database
database()
.ref(`code-sessions/${session_id}/users-connected`)
@@ -143,9 +170,24 @@ export default class sideDrawer extends React.Component {
}
+ let userStatus = userData.user_status;
+ let userPresenceStatus;
+ if(userStatus === "online"){
+ // user is online
+ // console.log(userData.user_name + " is ONLINE.");
+ userPresenceStatus =
+
+ } else if (userStatus === "offline"){
+ // user is offline
+ // console.log(userData.user_name + " is OFFLINE.");
+ userPresenceStatus =
+
+ }
+
usersList.push(
+ { userPresenceStatus }
{ displayUserNameCloneLink }
From 6caa3bd5f8494ee297e14fa28d94ffa5e4366f8b Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 14 Apr 2020 00:39:56 +0530
Subject: [PATCH 27/51] display creator's presence status in sidebar
---
src/components/SideDrawer/SideDrawer.js | 66 ++++++++++++++++++++++---
1 file changed, 60 insertions(+), 6 deletions(-)
diff --git a/src/components/SideDrawer/SideDrawer.js b/src/components/SideDrawer/SideDrawer.js
index ad1b0a4..23cee05 100644
--- a/src/components/SideDrawer/SideDrawer.js
+++ b/src/components/SideDrawer/SideDrawer.js
@@ -75,6 +75,44 @@ export default class sideDrawer extends React.Component {
this.setState({ isCreator: true });
}
+ // for updating creator's presence status
+ database()
+ .ref(`code-sessions/${session_id}/creator`)
+ .on('value', snapshot => {
+ let creatorData = snapshot.val();
+ if(user.uid === creatorData.user_id){
+ let creatorRef = database().ref(`code-sessions/${session_id}/creator/user_status`);
+ // monitor connection state on browser tab
+ database().ref(".info/connected")
+ .on("value", snapshot => {
+ let userStatus = snapshot.val();
+ if(userStatus) {
+ // set session creator's online status
+ creatorRef.onDisconnect().set('offline');
+ creatorRef.set('online');
+ } else {
+ // session creator has lost network
+ }
+ });
+ }
+ });
+
+ // for updating creator's presence status
+ database()
+ .ref(`code-sessions/${session_id}/creator/user_status`)
+ .on('value', snapshot => {
+ let creatorStatus = snapshot.val();
+ if(creatorStatus === "online"){
+ // session creator is online
+ creatorInfo.user_status = "online";
+ } else if (creatorStatus === "offline"){
+ // session creator is offline
+ creatorInfo.user_status = "offline";
+ }
+ // in order to re-render the sidebar component everytime there's a change
+ this.setState(this.state);
+ });
+
// setting states of 'cloneTrigger' & 'isFirstLoad' in database
database()
.ref(`code-sessions/${session_id}/cloneHelper`)
@@ -96,10 +134,10 @@ export default class sideDrawer extends React.Component {
.ref(`code-sessions/${session_id}/users-connected`)
.on('value', snapshot => {
snapshot.forEach(function(childSnapshot){
- var userData = childSnapshot.val();
+ let userData = childSnapshot.val();
if(user.uid === userData.user_id){
let userKey = childSnapshot.key;
- let userRef = database().ref(`code-sessions/${session_id}/users-connected/${userKey}/user_status`)
+ let userRef = database().ref(`code-sessions/${session_id}/users-connected/${userKey}/user_status`);
// monitor connection state on browser tab
database().ref(".info/connected")
.on("value", snapshot => {
@@ -108,12 +146,11 @@ export default class sideDrawer extends React.Component {
// set user's online status
userRef.onDisconnect().set('offline');
userRef.set('online');
- // console.log("User: ONLINE");
} else {
- // client has lost network
- // console.log("User: OFFLINE");
+ // user has lost network
}
});
+ return true;
}
});
});
@@ -198,6 +235,10 @@ export default class sideDrawer extends React.Component {
});
console.log("\n");
+
+ // in order to re-render the sidebar component everytime there's a change
+ this.setState(this.state);
+
});
// 'received-clone' pop-up handler
@@ -683,6 +724,18 @@ export default class sideDrawer extends React.Component {
onHide={clonePopupClose}
/>
}
+
+ let creatorStatus = creatorInfo.user_status;
+ let creatorPresenceStatus;
+ if(creatorStatus === "online"){
+ // user is online
+ creatorPresenceStatus =
+
+ } else if (creatorStatus === "offline"){
+ // user is offline
+ creatorPresenceStatus =
+
+ }
let drawerClasses = 'side-drawer';
if (this.props.show) {
@@ -696,8 +749,9 @@ export default class sideDrawer extends React.Component {
+ { creatorPresenceStatus }
-
{creatorInfo.user_name}
+
{creatorInfo.user_name}
From 0adbff8bd10397bb5eec25352f120e58600e8504 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 14 Apr 2020 00:41:18 +0530
Subject: [PATCH 28/51] add presence status (dot) styling
---
src/components/SideDrawer/SideDrawer.css | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/src/components/SideDrawer/SideDrawer.css b/src/components/SideDrawer/SideDrawer.css
index 381f260..800d0b9 100644
--- a/src/components/SideDrawer/SideDrawer.css
+++ b/src/components/SideDrawer/SideDrawer.css
@@ -59,7 +59,7 @@
border: 1px solid #222;
}
-.side-drawer .creator-info span {
+.side-drawer .creator-info .creator-name {
color: #000000;
font-size: 1rem;
margin-left: 10px;
@@ -174,6 +174,26 @@
border-radius: 50%;
}
+.green-dot-creator {
+ background-color: #41d641;
+ height: 10px;
+ width: 10px;
+ display: flex;
+ margin-right: 10px;
+ margin-left: -20px;
+ border-radius: 50%;
+}
+
+.red-dot-creator {
+ background-color: #F44336;
+ height: 10px;
+ width: 10px;
+ display: flex;
+ margin-right: 10px;
+ margin-left: -20px;
+ border-radius: 50%;
+}
+
/* @media (min-width: 769px) {
.side-drawer {
display: none;
From 7be90c5f2809d71663bb7eca29fe6c1bb39ead25 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 14 Apr 2020 00:43:11 +0530
Subject: [PATCH 29/51] add firepad scripts to index.html
---
public/index.html | 30 ++++++++++++++++++++++++++++++
src/containers/App.css | 9 +++++++++
2 files changed, 39 insertions(+)
diff --git a/public/index.html b/public/index.html
index d9236a9..85f50ed 100644
--- a/public/index.html
+++ b/public/index.html
@@ -6,6 +6,36 @@
Code Room | Coding Ninjas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/containers/App.css b/src/containers/App.css
index dde062e..f090fd0 100644
--- a/src/containers/App.css
+++ b/src/containers/App.css
@@ -44,6 +44,15 @@
height: calc(100vh - 80px);
}
+.firepad {
+ height: calc(100vh - 80px);
+}
+
+.powered-by-firepad {
+ display: none;
+ z-index: 0;
+}
+
.codingpage {
height: calc(100vh - 80px);
}
From f912651414520c1be4fde940db9f157c33526939 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 14 Apr 2020 00:47:33 +0530
Subject: [PATCH 30/51] switch to firepad editor
---
src/config/firebase-config.js | 1 +
src/containers/pages/Coding.js | 186 +++++++++++++++++----------------
2 files changed, 98 insertions(+), 89 deletions(-)
diff --git a/src/config/firebase-config.js b/src/config/firebase-config.js
index 15605e2..07c315d 100644
--- a/src/config/firebase-config.js
+++ b/src/config/firebase-config.js
@@ -1,6 +1,7 @@
import firebase from 'firebase/app';
import 'firebase/database';
import 'firebase/auth';
+window.firebase = firebase;
const firebaseConfig = {
apiKey: process.env.REACT_APP_FIREBASE_API_KEY,
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index 8dd527f..a8c4a6b 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -1,6 +1,5 @@
import React from "react";
import random from "random-key";
-import CodeMirror from "react-codemirror";
import Header from "../../components/Header/Header";
import SideDrawer from '../../components/SideDrawer/SideDrawer';
import Backdrop from '../../components/Backdrop/Backdrop';
@@ -11,24 +10,6 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faBars } from '@fortawesome/free-solid-svg-icons';
import { faToggleOn, faToggleOff } from '@fortawesome/free-solid-svg-icons';
-import "codemirror/lib/codemirror";
-import "codemirror/lib/codemirror.css";
-import 'codemirror/mode/xml/xml';
-import 'codemirror/mode/markdown/markdown';
-import "codemirror/mode/javascript/javascript";
-import "codemirror/mode/clike/clike";
-import "codemirror/mode/python/python";
-import "codemirror/theme/dracula.css";
-import 'codemirror/addon/edit/closetag';
-import 'codemirror/addon/edit/matchbrackets';
-import 'codemirror/addon/edit/closebrackets';
-import 'codemirror/addon/edit/matchtags';
-import 'codemirror/addon/edit/trailingspace';
-import 'codemirror/addon/hint/show-hint';
-import 'codemirror/addon/hint/show-hint.css';
-import 'codemirror/addon/hint/javascript-hint';
-import 'codemirror/addon/comment/comment';
-
const appTokenKey = "appToken";
const sessionID = "sessionID";
const creatorInfo = {};
@@ -54,7 +35,7 @@ export default class CodingPage extends React.Component {
readOnly: false,
isCreator: false,
sideDrawerOpen: false,
- mode: 'markdown',
+ mode: 'xml',
code: "Loading...",
cursorPosition: {
line: 0,
@@ -81,7 +62,7 @@ export default class CodingPage extends React.Component {
// setting initial state
state = {
sideDrawerOpen: false,
- mode: 'markdown',
+ mode: 'xml',
code: "Loading...",
cursorPosition: {
line: 0,
@@ -172,7 +153,7 @@ export default class CodingPage extends React.Component {
// making the users-editing-state button dynamic
database()
- .ref(`code-sessions/${params.sessionid}`)
+ .ref(`code-sessions/${session_id}`)
.on('value', snapshot => {
// console.log("readOnly changed!");
if(this.userEditingToggleBtn !== null){
@@ -204,41 +185,107 @@ export default class CodingPage extends React.Component {
}
});
+ this.firepadRef = database().ref(`code-sessions/${session_id}/firepad`);
+
+ this.codemirror = window.CodeMirror(this.firepadDiv, {
+ mode: this.state.mode,
+ theme: "dracula",
+ lineNumbers: true,
+ lineWrapping: true,
+ autoCloseTags: true,
+ matchBrackets: true,
+ autoCloseBrackets: true,
+ matchTags: true,
+ showTrailingSpace: true,
+ extraKeys: {
+ 'Ctrl-Space' : 'autocomplete',
+ 'Cmd-/' : 'toggleComment',
+ 'Ctrl-/' : 'toggleComment'
+ },
+ });
+
+ this.firepad = window.Firepad.fromCodeMirror(this.firepadRef, this.codemirror, {
+ // richTextShortcuts: true,
+ // richTextToolbar: true,
+ // defaultText: "Loading...",
+ });
+
+ database()
+ .ref(`code-sessions/${session_id}/firepad/history`)
+ // .orderByKey()
+ .on("value", snapshot => {
+ // console.log("Number of revisions:", snapshot.numChildren());
+ let count = 0;
+ // keeping record (history) of last 150 changes in database
+ if(snapshot.numChildren() > 150){
+ let minCount = snapshot.numChildren() - 150;
+ snapshot.forEach(function(childSnapshot){
+ if(count === minCount){
+ return true;
+ }
+ // console.log("Deleted! " + count + " " + childSnapshot.key);
+ childSnapshot.ref.remove();
+ count++;
+ });
+ }
+
+ database()
+ .ref(`code-sessions/${session_id}/firepad/history`)
+ .once("value")
+ .then(snapshot => {
+ // console.log("New number of revisions:", snapshot.numChildren());
+ });
+
+ });
+
let self = this;
database()
- .ref("/code-sessions/" + params.sessionid)
+ .ref(`code-sessions/${session_id}`)
.once("value")
.then(snapshot => {
// trimmimg the Date() to remove unnecessary add-ons
var createdOn = snapshot.val().createdon;
var createdOnCompressed = createdOn.substring(0, 25);
- self.setState({ code: snapshot.val().content + "", createdon: createdOnCompressed }, () => {
- // fetching content from db and setting on the editor
- let content = snapshot.val().content;
- self.codemirror.getCodeMirror().setValue(content);
- // console.log(this.codemirror.getCodeMirror());
+ self.setState({
+ code: snapshot.val().content + "",
+ createdon: createdOnCompressed
+ });
+
+ /**** TODO: ****/
+ // this.codemirror.setValue("Loading...");
+ // this.codemirror.setValue("");
+
+ this.firepad.on('ready', function() {
+ if (self.firepad.isHistoryEmpty()) {
+ self.firepad.setText(self.state.code);
+ }
+ // self.firepad.setUserId(userId)
+ });
+
+ // called whenever changes are made in editor
+ this.firepad.on('synced', function(isSynced) {
+
+ // console.log(firepad.getText());
+ let newVal = self.firepad.getText();
+
+ // updating data in database
+ let codeRef = database().ref(`code-sessions/${session_id}`);
+ codeRef.child("content").set(newVal);
+
});
- // whenever changes are made:
- // "code" is updated from the db
- // cursor position is updated (changeCursorPos() is called)
- // code on the editor screen is updated from the db
- this.codeRef = database().ref("code-sessions/" + params.sessionid);
+ // changing 'readOnly' state of editor
+ this.codeRef = database().ref(`code-sessions/${session_id}`);
this.codeRef.on("value", function(snapshot) {
- self.setState({
- code: snapshot.val().content
- });
- var currentCursorPos = self.state.cursorPosition;
- self.codemirror.getCodeMirror().setValue(snapshot.val().content);
- self.setState({ cursorPosition: currentCursorPos });
- self.changeCursorPos();
// setting 'readOnly' option
if(self.state.isCreator){
- self.codemirror.getCodeMirror().setOption("readOnly", false);
+ // self.codemirror.getCodeMirror().setOption("readOnly", false);
+ self.codemirror.setOption("readOnly", false);
} else {
- self.codemirror.getCodeMirror().setOption("readOnly", snapshot.val().readOnly);
+ // self.codemirror.getCodeMirror().setOption("readOnly", snapshot.val().readOnly);
+ self.codemirror.setOption("readOnly", snapshot.val().readOnly);
}
});
@@ -246,32 +293,12 @@ export default class CodingPage extends React.Component {
})
.catch(e => {
// no session found corresponding to "sessionid" passed in the params
- self.codemirror.getCodeMirror().setValue("No Sessions Found!");
+ this.firepad.dispose();
+ self.codemirror.setValue("No Session Found!");
});
};
- // updating cursor position
- changeCursorPos = () => {
- const { line, ch } = this.state.cursorPosition;
- this.codemirror.getCodeMirror().doc.setCursor(line, ch);
- };
-
- // called whenever code is changed
- onChange = (newVal, change) => {
- // console.log(newVal, change);
- this.setState({
- cursorPosition: {
- line: this.codemirror.getCodeMirror().doc.getCursor().line,
- ch: this.codemirror.getCodeMirror().doc.getCursor().ch
- }
- },
- () => {}
- );
- // updating data in database
- this.codeRef.child("content").set(newVal);
- };
-
// sign-out functionality
handleLogout() {
logout().then(function () {
@@ -308,7 +335,9 @@ export default class CodingPage extends React.Component {
var mode = e.target.value;
this.setState({
mode: mode
- });
+ });
+ // setting new language mode in the editor
+ this.codemirror.setOption("mode", mode);
};
render() {
@@ -361,7 +390,7 @@ export default class CodingPage extends React.Component {
- Markdown
+ Markdown
JavaScript
C
C++
@@ -385,30 +414,9 @@ export default class CodingPage extends React.Component {
{ backdrop }
+
+ (this.firepadDiv = r)}>
-
- (this.codemirror = r)}
- className="code-mirror-container"
- value={this.state.code}
- onChange={this.onChange}
- options={{
- mode: this.state.mode,
- theme: "dracula",
- lineNumbers: true,
- autoCloseTags: true,
- matchBrackets: true,
- autoCloseBrackets: true,
- matchTags: true,
- showTrailingSpace: true,
- extraKeys: {
- 'Ctrl-Space' : 'autocomplete',
- 'Cmd-/' : 'toggleComment',
- 'Ctrl-/' : 'toggleComment'
- }
- }}
- />
-
);
}
From 2980a0db411d22d88a6cb65f71e1f911cc1e55cb Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 21 Apr 2020 13:09:44 +0530
Subject: [PATCH 31/51] fix: favicon not appearing
---
.firebase/hosting.YnVpbGQ.cache | 34 ++++++++++++++++-----------------
src/containers/pages/Coding.js | 9 +++++++++
2 files changed, 26 insertions(+), 17 deletions(-)
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
index a4a323c..73f04ec 100644
--- a/.firebase/hosting.YnVpbGQ.cache
+++ b/.firebase/hosting.YnVpbGQ.cache
@@ -1,17 +1,17 @@
-asset-manifest.json,1586247811631,3696ff9edf6549560d2838418340c55999f4e06dae5530c918e68138d53c8558
-index.html,1586247811590,e9e8d9bc0d01139e36f2701934a336093336462c5c9a2da05b9c077bda9119d3
-precache-manifest.7a6f988679ff96b953e558efea156cb7.js,1586247811590,74b2c79822e35f4fb9bab7c044fc642bbb7b4766c27224603ae9d2104c8762fc
-service-worker.js,1586247811590,7c9063040f8e16ffec2178f657859647c42055c8b1750a76d7addfff4e972168
-static/css/main.792b9d28.chunk.css,1586247811633,d207b75e4ebf91870b8de3543a5332bff773a9b6a6ea36d91a3d9fce16fed9b6
-static/js/2.4c74b29d.chunk.js.LICENSE.txt,1586247811632,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-static/css/main.792b9d28.chunk.css.map,1586247811632,48cfa21cfe6d69e5e2a6957423524c48beb65cb0ef09af2096d1d9d4ad87e4b6
-static/js/main.73193553.chunk.js,1586247811635,0515bd048af9659df3a3a9590f2f2665c9ad28526a1954591774d463d16bdd7c
-favicon_CN.ico,1586247779775,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/js/runtime-main.e13d1eff.js,1586247811590,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-static/js/runtime-main.e13d1eff.js.map,1586247811635,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/media/CNLOGO.c149ff8b.svg,1586247811590,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-static/js/main.73193553.chunk.js.map,1586247811635,31be371a8fde559f78f8c1a5a5de07be7bd6b6a6a6f1c04362a10e1218aaebff
-static/css/2.918a5898.chunk.css,1586247811591,32b8d2f30d1ddc5a96ca009ec979dc5955f8e6ab686e92effe43431d8ca75613
-static/css/2.918a5898.chunk.css.map,1586247811634,5c6cabc6d428b62a1ae4417b0816785f7e933f56156cc7be0475f8bf87583f84
-static/js/2.4c74b29d.chunk.js,1586247811634,93f4d8a2c38e30c120309f4c7574a67f214e0fcbd6e1ae67f3962b2a0412ec9c
-static/js/2.4c74b29d.chunk.js.map,1586247811633,04644b0a3c2d528864bebc895b5468c5dfd295d4f4ac88f6b794ed3cda211f5b
+asset-manifest.json,1586805818899,317c4c7d8c3d6314cfbaf513ea009424a2df2d80d2a5e5772eaee34c38498ebb
+precache-manifest.856809589dbf6a87763b8daa4aa388c1.js,1586805818866,57ffaee30872f45be9b18cb7ca98a2dcea98023947fc1e6b4436ae13f2d8d654
+index.html,1586805818865,7acd86b6f3a38ab1d246c1e99c30e330124abd35b7d8f18d28f004ff299eed12
+service-worker.js,1586805818865,dc4c24a5eb6b995bec0d6cd1d05f2a996804f9dbadea7e257e5bdf98ed3f5f93
+static/css/main.7a0c3c3f.chunk.css,1586805818899,5af0af8703fed5253ef0c6412fd636acdeabcd635310c24f50ffda330474f839
+static/js/2.14e1e139.chunk.js.LICENSE.txt,1586805818900,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
+static/css/main.7a0c3c3f.chunk.css.map,1586805818900,f73f0d375d43098a60cab320fca2d46f091fc4322b39c5d74e7828bbd8bd1ae8
+static/js/main.14a8e932.chunk.js,1586805818868,706e3f762519018cc33173a8bc97bb7278be0f7bc62a5efdfadedd375e0240e5
+static/js/runtime-main.e13d1eff.js,1586805818902,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
+static/js/runtime-main.e13d1eff.js.map,1586805818900,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
+static/media/CNLOGO.c149ff8b.svg,1586805818902,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
+favicon_CN.ico,1586805793485,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
+static/css/2.47e06e2e.chunk.css,1586805818899,8ad0538bbe847d6fa20053ffe5499bf18f1ae13b691f0e893241495889b60abd
+static/js/main.14a8e932.chunk.js.map,1586805818902,1b46234240b1b7cd36abcb960ba5ba2ba88c1f1ae431dcd6d8d0d72e47f69ab7
+static/css/2.47e06e2e.chunk.css.map,1586805818902,dfcf2b2f517f64006f1d90fb3b9a0feb3d65e8725a3aa0ad70ca97f9c3b60283
+static/js/2.14e1e139.chunk.js,1586805818900,9bf3d01009e145d6e61ea984474ac3731a7ad16eaf51a4b7f5eefe181ba7440d
+static/js/2.14e1e139.chunk.js.map,1586805818902,ee106b386a684c716367e506083406b35c31ff2912f68fc746191d8dcb999ccc
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index a8c4a6b..0f94b0c 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -19,6 +19,15 @@ export default class CodingPage extends React.Component {
constructor(props) {
super(props);
+ // favicon script
+ (function() {
+ var link = document.querySelector("link[rel*='icon']") || document.createElement('link');
+ link.type = 'image/x-icon';
+ link.rel = 'shortcut icon';
+ link.href = '../favicon_CN.ico';
+ document.getElementsByTagName('head')[0].appendChild(link);
+ })();
+
const session_id = this.props.match.params.sessionid;
// if appTokenKey is not found in localStorage,
From ebcc376bc37ec7ba99339f6e9b4a6322e645dec0 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 21 Apr 2020 13:11:23 +0530
Subject: [PATCH 32/51] display creator name below 'created on'
---
src/containers/pages/Coding.js | 63 +++++++++++++++++++++-------------
1 file changed, 39 insertions(+), 24 deletions(-)
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index 0f94b0c..7347e9f 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -392,31 +392,46 @@ export default class CodingPage extends React.Component {
style={{ background: "#1d1f27" }}
extras={
- {this.state.createdon
- ? `Created On: ${this.state.createdon}`
- : ""}
-
-
- Markdown
- JavaScript
- C
- C++
- Java
- Python
-
-
- { readOnlyToggle }
- { userEditingToggle }
-
-
- Sign Out
-
+
+
+
+ {this.state.createdon
+ ? `Created On: ${this.state.createdon}`
+ : ""}
+
+
+ {this.state.createdon
+ ? `Created By: ${creatorInfo.user_name}`
+ : ""}
+
+
+
+
+
+
+ Markdown
+ JavaScript
+ C
+ C++
+ Java
+ Python
+
+
+ { readOnlyToggle }
+ { userEditingToggle }
+
+
+ Sign Out
+
+
+
+
+
+
+
-
-
-
}
/>
From ec51f285730f7787a3f9b689e6b4ef634ad2bcd0 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 21 Apr 2020 13:12:40 +0530
Subject: [PATCH 33/51] fix: single clone popup state
---
src/components/SideDrawer/SideDrawer.js | 30 +++++++++++++++++--------
1 file changed, 21 insertions(+), 9 deletions(-)
diff --git a/src/components/SideDrawer/SideDrawer.js b/src/components/SideDrawer/SideDrawer.js
index 23cee05..ae08acd 100644
--- a/src/components/SideDrawer/SideDrawer.js
+++ b/src/components/SideDrawer/SideDrawer.js
@@ -160,7 +160,7 @@ export default class sideDrawer extends React.Component {
.ref(`code-sessions/${session_id}/users-connected`)
.on('value', snapshot => {
clonesCreated.numOfClonesCreated = snapshot.numChildren();
- console.log("\nConnected users: ");
+ console.log(`\nConnected users: ${snapshot.numChildren()}`);
usersList.splice(0, usersList.length);
var i = 0;
@@ -291,14 +291,14 @@ export default class sideDrawer extends React.Component {
});
}
- // setting state of 'clonePopupShow' to false in database
- // after delay of 500 milliseconds
- function clonePopupShowStateDelay(){
- database()
- .ref(`code-sessions/${session_id}/singleCloneHelper/clonePopupShow`)
- .set(false);
- }
- setTimeout(clonePopupShowStateDelay, 500);
+ // // setting state of 'clonePopupShow' to false in database
+ // // after delay of 500 milliseconds
+ // function clonePopupShowStateDelay(){
+ // database()
+ // .ref(`code-sessions/${session_id}/singleCloneHelper/clonePopupShow`)
+ // .set(false);
+ // }
+ // setTimeout(clonePopupShowStateDelay, 500);
}
@@ -371,6 +371,7 @@ export default class sideDrawer extends React.Component {
.ref("code-sessions/" + newSessionKey)
.set({
cloneSentBy: creator_uid,
+ clonedFromSession: session_id,
content: existingContent,
createdon: date,
readOnly: false,
@@ -524,6 +525,7 @@ export default class sideDrawer extends React.Component {
.ref("code-sessions/" + newSessionKey)
.set({
cloneSentBy: creator_uid,
+ clonedFromSession: session_id,
content: existingContent,
createdon: date,
readOnly: false,
@@ -657,6 +659,16 @@ export default class sideDrawer extends React.Component {
// indicating 'send-clone' button is clicked
this.codeRef.child("singleCloneHelper").child("cloneTrigger").set(newCloneTrigger);
+ const session_id = this.props.session_id;
+ // setting state of 'clonePopupShow' to false in database
+ // after delay of 500 milliseconds
+ function clonePopupShowStateDelay(){
+ database()
+ .ref(`code-sessions/${session_id}/singleCloneHelper/clonePopupShow`)
+ .set(false);
+ }
+ setTimeout(clonePopupShowStateDelay, 800);
+
};
// 'send-clone' button handler
From 50c48d9b1af6918a5b3922ac2157d1157e4316d2 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 21 Apr 2020 13:13:14 +0530
Subject: [PATCH 34/51] display no. of connected users in sidebar
---
src/components/SideDrawer/SideDrawer.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/SideDrawer/SideDrawer.js b/src/components/SideDrawer/SideDrawer.js
index ae08acd..54188e2 100644
--- a/src/components/SideDrawer/SideDrawer.js
+++ b/src/components/SideDrawer/SideDrawer.js
@@ -770,7 +770,7 @@ export default class sideDrawer extends React.Component {
{ sendCloneButton }
- Connected Users:
+ Connected Users: {clonesCreated.numOfClonesCreated}
{ clonePopUp }
From 0822b21e6118b17ae4eb33e7126d30c767616bb0 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Tue, 21 Apr 2020 13:14:31 +0530
Subject: [PATCH 35/51] add dashboard button in home page
---
src/containers/pages/Home.js | 36 +++++++++++++++++++++++++++++++++---
1 file changed, 33 insertions(+), 3 deletions(-)
diff --git a/src/containers/pages/Home.js b/src/containers/pages/Home.js
index c39c134..044a706 100644
--- a/src/containers/pages/Home.js
+++ b/src/containers/pages/Home.js
@@ -81,6 +81,29 @@ export default class HomePage extends React.Component {
};
+ // when 'Dashboard' button is clicked
+ goToDashboard = () => {
+
+ // to fetch currently signed-in user
+ firebaseAuth().onAuthStateChanged(user => {
+ // firebaseAuth().onIdTokenChanged(user => {
+ try {
+ if (user) {
+
+ this.props.history.push("/dashboard");
+
+ } else {
+ console.log("Cannot fetch currently signed-in user!");
+ console.log("Signing out... please login again.");
+ this.handleLogout();
+ }
+ } catch(error) {
+ console.log("Error in authentication:", error);
+ }
+ });
+
+ };
+
// sign-out functionality
handleLogout() {
logout().then(function () {
@@ -95,7 +118,14 @@ export default class HomePage extends React.Component {
return (
+ {this.state.num ? `Total ${this.state.num}+ Shares` : null}
+
+ Sign Out
+
+
+ }
/>
+
+ Title:
+
+ (this.sessionTitle = r)}
+ className="session-title-input"
+ readOnly="true"
+ placeholder="Enter title..."
+ defaultValue="Untitled"
+ onChange={this.sessionTitleHandler} />
+
+ }
extras={
diff --git a/src/containers/pages/Home.js b/src/containers/pages/Home.js
index 044a706..a5bd9c5 100644
--- a/src/containers/pages/Home.js
+++ b/src/containers/pages/Home.js
@@ -54,6 +54,7 @@ export default class HomePage extends React.Component {
.set({
content: "
I ♥ Coding! ",
createdon: Date(),
+ title: "Untitled",
readOnly: false, // by default 'false'
});
From 937aaed56b2f3c28c04dbb656076c4504a751989 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Wed, 22 Apr 2020 00:26:02 +0530
Subject: [PATCH 40/51] improve styling
---
src/containers/App.css | 43 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/src/containers/App.css b/src/containers/App.css
index c7b5907..382adab 100644
--- a/src/containers/App.css
+++ b/src/containers/App.css
@@ -9,6 +9,11 @@
width: auto;
}
+.logo-header {
+ height: 40px;
+ padding-bottom: 3px;
+}
+
.App-header {
background-color: #000000;
height: 80px;
@@ -36,6 +41,44 @@
text-decoration: none;
}
+.session-title-input {
+ height: 30px;
+ width: 15rem;
+ margin-left: 5px;
+ padding: 5px;
+ background-color: #1d1f27;
+ color: #fff;
+ font-size: 19px;
+ border: 1px solid #1d1f27;
+ border-radius: 6px;
+}
+
+.session-title-input:focus {
+ outline: none;
+}
+
+.session-title-input:hover {
+ background-color: #222;
+ color: #fff;
+ border: 1px solid #ffffff6e;
+ border-radius: 6px;
+}
+
+.session-title {
+ margin-left: 50px;
+ color: #ffffffd6;
+ font-size: 17px;
+ text-decoration: none;
+}
+
+.session-title .session-title-name {
+ margin-left: 50px;
+ color: #fff;
+ font-size: 18px;
+ text-decoration: none;
+ border-bottom: 1px solid #fff;
+}
+
.homepage {
display: flex;
padding: 0px 64px;
From c1ad588cd2e9aa2baec3710fd63e3e79bd646f68 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Wed, 22 Apr 2020 00:26:32 +0530
Subject: [PATCH 41/51] display CN logo in header
---
src/components/Header/Header.js | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/components/Header/Header.js b/src/components/Header/Header.js
index 7d74cbd..6673a3b 100644
--- a/src/components/Header/Header.js
+++ b/src/components/Header/Header.js
@@ -1,17 +1,20 @@
import React from "react";
import { Link } from "react-router-dom";
+import logo from '../../images/CNLOGO.svg';
type Props = {
style: React.CSSProperties,
- extras: React.ReactHTML
+ title: React.ReactHTML,
+ extras: React.ReactHTML,
};
const Header = (props: Props) => {
return (
- Code Room | Coding Ninjas
+ Code Room |
+ {props.title}
{props.extras}
);
From b28a0a069efe3c9765ebe2cb592320ffa2212479 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Wed, 22 Apr 2020 00:48:34 +0530
Subject: [PATCH 42/51] add existing session-title to clones
---
src/components/SideDrawer/SideDrawer.js | 19 ++++++++++++++-----
src/containers/pages/Coding.js | 2 +-
2 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/src/components/SideDrawer/SideDrawer.js b/src/components/SideDrawer/SideDrawer.js
index 54188e2..e4e3eff 100644
--- a/src/components/SideDrawer/SideDrawer.js
+++ b/src/components/SideDrawer/SideDrawer.js
@@ -337,13 +337,15 @@ export default class sideDrawer extends React.Component {
date = Date();
- // fetching existing code in this session ID to be cloned
+ // fetching existing code and session-title in this session ID to be cloned
var existingContent;
+ var existingSessionTitle;
database()
.ref(`code-sessions/${session_id}`)
.once("value")
.then(snapshot => {
existingContent = snapshot.val().content;
+ existingSessionTitle = snapshot.val().title;
})
.catch(e => {
console.log(e);
@@ -375,6 +377,7 @@ export default class sideDrawer extends React.Component {
content: existingContent,
createdon: date,
readOnly: false,
+ title: existingSessionTitle,
});
// adding details of the user as creator to the database
@@ -421,14 +424,16 @@ export default class sideDrawer extends React.Component {
let cloneSentBy = childSnapshot.child("cloneSentBy").val();
let user_id = childSnapshot.child("creator").child("user_id").val();
let content = childSnapshot.child("content").val();
+ let sessionTitle = childSnapshot.child("title").val();
let createdOn = childSnapshot.child("createdon").val();
let createdOnCompressed = createdOn.substring(0, 21);
// Comparing: content (code), user id (uid),
- // cloneSentBy (creator id), date (createOn)
+ // cloneSentBy (creator id), date (createOn) & session-title
if(cloneSentBy === creator_uid
&& user_id === user.uid
&& content === existingContent
+ && sessionTitle === existingSessionTitle
&& createdOnCompressed === dateCompressed) {
let cloneSessionID = childSnapshot.key;
@@ -493,13 +498,15 @@ export default class sideDrawer extends React.Component {
date = Date();
- // fetching existing code in this session ID to be cloned
+ // fetching existing code and session-title in this session ID to be cloned
var existingContent;
+ var existingSessionTitle;
database()
.ref(`code-sessions/${session_id}`)
.once("value")
.then(snapshot => {
existingContent = snapshot.val().content;
+ existingSessionTitle = snapshot.val().title;
})
.catch(e => {
console.log(e);
@@ -516,7 +523,6 @@ export default class sideDrawer extends React.Component {
snapshot.forEach(function(childSnapshot){
- // console.log(existingContent);
let newSessionKey = random.generate(5);
let userData = childSnapshot.val();
@@ -529,6 +535,7 @@ export default class sideDrawer extends React.Component {
content: existingContent,
createdon: date,
readOnly: false,
+ title: existingSessionTitle,
});
// adding details of the user as creator to the database
@@ -575,14 +582,16 @@ export default class sideDrawer extends React.Component {
let cloneSentBy = childSnapshot.child("cloneSentBy").val();
let user_id = childSnapshot.child("creator").child("user_id").val();
let content = childSnapshot.child("content").val();
+ let sessionTitle = childSnapshot.child("title").val();
let createdOn = childSnapshot.child("createdon").val();
let createdOnCompressed = createdOn.substring(0, 21);
// Comparing: content (code), user id (uid),
- // cloneSentBy (creator id), date (createOn)
+ // cloneSentBy (creator id), date (createOn) & session-title
if(cloneSentBy === creator_uid
&& user_id === user.uid
&& content === existingContent
+ && sessionTitle === existingSessionTitle
&& createdOnCompressed === dateCompressed) {
let cloneSessionID = childSnapshot.key;
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index 349bbe1..340311b 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -425,7 +425,7 @@ export default class CodingPage extends React.Component {
(this.sessionTitle = r)}
className="session-title-input"
- readOnly="true"
+ readOnly={true}
placeholder="Enter title..."
defaultValue="Untitled"
onChange={this.sessionTitleHandler} />
From 2684e5ccf6af48df1ec19937dc03a6ad0a5f6e5c Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Wed, 22 Apr 2020 02:08:39 +0530
Subject: [PATCH 43/51] prevent space as input in session-title
---
src/containers/pages/Coding.js | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index 340311b..9bc8c4e 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -61,7 +61,11 @@ export default class CodingPage extends React.Component {
this.setState({ readOnly: readOnly });
// setting session title in the header
let sessionTitle = snapshot.val().title;
- this.sessionTitle.value = sessionTitle;
+ if(sessionTitle === undefined || sessionTitle === ""){
+ this.sessionTitle.value = "Untitled";
+ } else {
+ this.sessionTitle.value = sessionTitle;
+ }
})
.catch(e => {
// no session found corresponding to "sessionid" passed in the params
@@ -179,6 +183,14 @@ export default class CodingPage extends React.Component {
}
});
+ // prevent space as input in session-title
+ this.sessionTitle.addEventListener('keypress', function(event) {
+ let key = event.keyCode;
+ if (key === 32) {
+ event.preventDefault();
+ }
+ });
+
// setting session-tile readOnly state
if(this.state.isCreator){
if(this.sessionTitle !== null && this.sessionTitle !== undefined){
@@ -425,9 +437,12 @@ export default class CodingPage extends React.Component {
(this.sessionTitle = r)}
className="session-title-input"
+ type="text"
readOnly={true}
placeholder="Enter title..."
defaultValue="Untitled"
+ minLength="1"
+ maxLength="30"
onChange={this.sessionTitleHandler} />
}
From 8212b0b1b6423dcc55291b8fd23df61b91c7f709 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Wed, 22 Apr 2020 02:10:58 +0530
Subject: [PATCH 44/51] add dashboard page
---
src/containers/pages/Dashboard.js | 306 ++++++++++++++++++++++++++++++
1 file changed, 306 insertions(+)
create mode 100644 src/containers/pages/Dashboard.js
diff --git a/src/containers/pages/Dashboard.js b/src/containers/pages/Dashboard.js
new file mode 100644
index 0000000..0b34bf7
--- /dev/null
+++ b/src/containers/pages/Dashboard.js
@@ -0,0 +1,306 @@
+import React from "react";
+import Header from "../../components/Header/Header";
+import { database } from "firebase/app";
+import { firebaseAuth } from "../../config/firebase-config";
+import { logout } from "../../helpers/auth";
+
+const appTokenKey = "appToken";
+const sessionID = "sessionID";
+const userSessionsList = [];
+const sessionClonesList = [];
+const userDisplayName = {};
+
+export default class Dashboard extends React.Component {
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ helper: true,
+ isLoadingUserSession: true,
+ viewClonesHelpText: false,
+ isLoadingSessionClones: false,
+ noCloneFoundText: false,
+ };
+
+ if (localStorage.getItem(sessionID)){
+ localStorage.removeItem(sessionID);
+ }
+
+ if (!localStorage.getItem(appTokenKey)) {
+ this.props.history.push(`/login`);
+ return;
+ }
+
+ this.handleLogout = this.handleLogout.bind(this);
+ this.viewClonesHandler = this.viewClonesHandler.bind(this);
+ }
+
+ componentDidMount = () => {
+
+ // to fetch currently signed-in user
+ firebaseAuth().onAuthStateChanged(user => {
+ try {
+ if (user) {
+
+ // storing current user's name
+ userDisplayName.name = user.displayName;
+
+ // to reset/hide the session clones list whenever dashboard page is opened
+ sessionClonesList.splice(0, sessionClonesList.length);
+
+ // database().ref(`/${session_id}/creator`).orderByChild("user_id").equalTo(user.uid).on('value', function (snapshot) {});
+
+ database()
+ .ref(`code-sessions/`)
+ .once("value")
+ .then(snapshot => {
+ // console.log("Searching for all sessions created by current user...");
+ userSessionsList.splice(0, userSessionsList.length);
+ let self = this;
+ let i = 0;
+
+ snapshot.forEach(function(childSnapshot){
+
+ let creator_id = childSnapshot.child("creator").child("user_id").val();
+ let sessionsTitle = childSnapshot.child("title").val();
+ let createdOn = childSnapshot.child("createdon").val();
+ let createdOnCompressed = createdOn.substring(0, 24);
+
+ if(creator_id === user.uid) {
+
+ self.setState({
+ isLoadingUserSession: false,
+ viewClonesHelpText: true,
+ });
+
+ let sessionid = childSnapshot.key;
+ // console.log(`User session id: ${sessionid}`);
+
+ userSessionsList.push(
+
+
+
+ {sessionid}
+
+
+
+
+ { sessionsTitle }
+
+
+ { createdOnCompressed }
+
+
+ View Clones
+
+
+
+ );
+ i++;
+
+ self.setState(self.state);
+
+ }
+ });
+ // this.setState(this.state);
+ });
+
+ } else {
+
+ console.log("Cannot fetch currently signed-in user!");
+ console.log("Signing out... please login again.");
+ if (localStorage.getItem(appTokenKey)) {
+ // localStorage.setItem("sessionID", session_id);
+ logout().then(function () {
+ localStorage.removeItem(appTokenKey);
+ this.props.history.push("/login");
+ }.bind(this));
+ return;
+ }
+
+ }
+ } catch(error) {
+ console.log("Error in authentication:", error);
+ }
+ });
+ }
+
+ viewClonesHandler = (e) => {
+
+ this.setState({
+ viewClonesHelpText: false,
+ isLoadingSessionClones: true,
+ noCloneFoundText: false,
+ });
+
+ sessionClonesList.splice(0, sessionClonesList.length);
+
+ let correspondingSessionID = e.currentTarget.value;
+ // console.log(`correspondingSessionID: ${correspondingSessionID}`);
+
+ database()
+ .ref(`code-sessions/`)
+ .once("value")
+ .then(snapshot => {
+
+ // sessionClonesList.splice(0, sessionClonesList.length);
+ let found = false;
+ let self = this;
+ let i = 0;
+
+ snapshot.forEach(function(childSnapshot){
+
+ let clonedFromSessionID = childSnapshot.child("clonedFromSession").val();
+ let userName = childSnapshot.child("creator").child("user_name").val();
+ let userEmail = childSnapshot.child("creator").child("user_email").val();
+ let createdOn = childSnapshot.child("createdon").val();
+ let createdOnCompressed = createdOn.substring(0, 24);
+
+ if(clonedFromSessionID === correspondingSessionID) {
+ self.setState({isLoadingSessionClones: false});
+ found = true;
+ let cloneSesssionID = childSnapshot.key;
+ // console.log(`cloneSesssionID: ${cloneSesssionID}`);
+
+ sessionClonesList.push(
+
+
+
+ {cloneSesssionID}
+
+
+
+ { userName }
+
+ { userEmail }
+ { createdOnCompressed }
+
+ );
+ i++;
+
+ self.setState(self.state);
+ }
+
+ });
+
+ if(!found){
+ this.setState({
+ isLoadingSessionClones: false,
+ noCloneFoundText: true,
+ });
+ // console.log("No clones found!");
+ }
+
+ this.setState(this.state);
+
+ });
+ };
+
+ // sign-out functionality
+ handleLogout() {
+ logout().then(function () {
+ localStorage.removeItem(appTokenKey);
+ localStorage.removeItem(sessionID);
+ this.props.history.push("/login");
+ console.log("User signed-out from firebase.");
+ }.bind(this));
+ }
+
+ render() {
+
+ // console.log("render() called!");
+
+ let loadingTextUserSession;
+ if(this.state.isLoadingUserSession){
+ loadingTextUserSession = Loading... ;
+ }
+
+ let loadingTextSessionClones;
+ if(this.state.isLoadingSessionClones){
+ loadingTextSessionClones = Loading... ;
+ }
+
+ let viewClonesHelpText;
+ if(!this.state.isLoadingUserSession && this.state.viewClonesHelpText){
+ viewClonesHelpText =
+ (Click on the 'View Clones' button
+ corresponding to a session ID above) ;
+ }
+
+ let noCloneFoundText;
+ if(this.state.noCloneFoundText){
+ noCloneFoundText =
+ No Clones Found! ;
+ }
+
+ let usersSessionHeading;
+ let usersCloneHeading;
+ if(userDisplayName.name !== undefined){
+ let name = userDisplayName.name;
+ usersSessionHeading = name + "'s sessions";
+ usersCloneHeading = "Session clones";
+ }
+
+ return (
+
+
+ );
+ }
+
+}
\ No newline at end of file
From 655095e0255f9d8c9cc46da2e2d2d64dc0f5e8da Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Wed, 22 Apr 2020 02:11:29 +0530
Subject: [PATCH 45/51] add dashboard styling
---
src/containers/App.css | 126 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 126 insertions(+)
diff --git a/src/containers/App.css b/src/containers/App.css
index 382adab..21703f2 100644
--- a/src/containers/App.css
+++ b/src/containers/App.css
@@ -325,6 +325,132 @@ p {
);
}
+/*** Dashboard ***/
+
+.dashboard {
+ font-family: "Roboto", sans-serif;
+ background-color: #fff;
+ color: #222;
+ height: calc(100vh - 80px);
+ padding: 0px 64px;
+}
+
+.dashboard .sessions-title {
+ font-family: 'Montserrat', sans-serif;
+ color: #222;
+ font-size: 34px;
+ font-weight: 400;
+ margin: 0;
+ margin-bottom: 20px;
+ padding-top: 15px;
+}
+
+.dashboard .clones-title {
+ font-family: 'Montserrat', sans-serif;
+ color: #222;
+ font-size: 34px;
+ font-weight: 400;
+ margin: 0;
+ margin-bottom: 20px;
+ margin-top: 40px;
+}
+
+.clickable {
+ cursor: pointer;
+}
+
+.aligncenter {
+ text-align: center;
+}
+
+.loading-text {
+ display: flex;
+ justify-content: center;
+ font-size: 18px;
+ font-family: monospace;
+ margin-top: 15px;
+}
+
+.view-clones-help-text {
+ display: flex;
+ justify-content: center;
+ font-size: 15px;
+ font-family: monospace;
+ margin-top: 15px;
+}
+
+table {
+ /* background-color: white; */
+ width: 80%;
+ text-align: center;
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+table td, table th {
+ padding:7px;
+ text-align: center;
+}
+
+table th {
+ border-bottom: 1px solid #ccc;
+ border-top: 1px solid #ccc;
+}
+
+.table-collection {
+ margin: auto;
+}
+
+.table-collection th {
+ border-bottom: 1px solid #b3b5b8;
+ border-top: none;
+ text-transform: uppercase;
+}
+
+table tr {
+ border-bottom: 1px solid #ccc;
+ border-top: 1px solid #ccc;
+}
+
+.table-collection tr {
+ border-bottom: 1px solid #b3b5b8;
+ border-top: none;
+}
+
+.table-collection tbody tr:hover {
+ background-color: #f3f3f4;
+}
+
+.table-collection a {
+ color: #007bff;
+ font-weight: 700;
+ text-decoration: none;
+}
+
+.table-collection a:hover {
+ text-decoration: none;
+}
+
+.table-collection .title-color {
+ color: #a70a19;
+ font-weight: 500;
+}
+
+.view-clone-btn {
+ font-size: 14px;
+ border-radius: 5px;
+ border: 1px solid #007aff;
+}
+
+.view-clone-btn:hover {
+ background-color: #187deb;
+ color: #fff;
+}
+
+.view-clone-btn:focus {
+ outline: none;
+}
+
/* Coding Page */
.session-details {
From e767745e7623bd1358af78ee41a088f09ce12c64 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Wed, 22 Apr 2020 11:12:57 +0530
Subject: [PATCH 46/51] add spinning loading icon on coding page
---
.firebase/hosting.YnVpbGQ.cache | 34 +++++++-------
src/containers/App.css | 74 ++++++++++++++++++++++++-------
src/containers/pages/Coding.js | 21 +++++----
src/containers/pages/Dashboard.js | 2 -
4 files changed, 88 insertions(+), 43 deletions(-)
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
index 73f04ec..dfaa099 100644
--- a/.firebase/hosting.YnVpbGQ.cache
+++ b/.firebase/hosting.YnVpbGQ.cache
@@ -1,17 +1,17 @@
-asset-manifest.json,1586805818899,317c4c7d8c3d6314cfbaf513ea009424a2df2d80d2a5e5772eaee34c38498ebb
-precache-manifest.856809589dbf6a87763b8daa4aa388c1.js,1586805818866,57ffaee30872f45be9b18cb7ca98a2dcea98023947fc1e6b4436ae13f2d8d654
-index.html,1586805818865,7acd86b6f3a38ab1d246c1e99c30e330124abd35b7d8f18d28f004ff299eed12
-service-worker.js,1586805818865,dc4c24a5eb6b995bec0d6cd1d05f2a996804f9dbadea7e257e5bdf98ed3f5f93
-static/css/main.7a0c3c3f.chunk.css,1586805818899,5af0af8703fed5253ef0c6412fd636acdeabcd635310c24f50ffda330474f839
-static/js/2.14e1e139.chunk.js.LICENSE.txt,1586805818900,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-static/css/main.7a0c3c3f.chunk.css.map,1586805818900,f73f0d375d43098a60cab320fca2d46f091fc4322b39c5d74e7828bbd8bd1ae8
-static/js/main.14a8e932.chunk.js,1586805818868,706e3f762519018cc33173a8bc97bb7278be0f7bc62a5efdfadedd375e0240e5
-static/js/runtime-main.e13d1eff.js,1586805818902,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-static/js/runtime-main.e13d1eff.js.map,1586805818900,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/media/CNLOGO.c149ff8b.svg,1586805818902,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-favicon_CN.ico,1586805793485,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/css/2.47e06e2e.chunk.css,1586805818899,8ad0538bbe847d6fa20053ffe5499bf18f1ae13b691f0e893241495889b60abd
-static/js/main.14a8e932.chunk.js.map,1586805818902,1b46234240b1b7cd36abcb960ba5ba2ba88c1f1ae431dcd6d8d0d72e47f69ab7
-static/css/2.47e06e2e.chunk.css.map,1586805818902,dfcf2b2f517f64006f1d90fb3b9a0feb3d65e8725a3aa0ad70ca97f9c3b60283
-static/js/2.14e1e139.chunk.js,1586805818900,9bf3d01009e145d6e61ea984474ac3731a7ad16eaf51a4b7f5eefe181ba7440d
-static/js/2.14e1e139.chunk.js.map,1586805818902,ee106b386a684c716367e506083406b35c31ff2912f68fc746191d8dcb999ccc
+asset-manifest.json,1587501766946,97893db9d7ddc996e9a427f1f108efe462891f22ee85bc0a677663314d36269e
+precache-manifest.ac52202743a6fa0f77f1e7dbd156f9a4.js,1587501766943,f39489e5995cb1dced43d51c50ecca31f7766e0e3a8fee5e2030418e0578c50e
+index.html,1587501766942,271bc9beb6e73276b8ec472a8697cb0c069d70483d651de020002ca4a4f14735
+service-worker.js,1587501766943,b7806d71b76f2cdc893372fc3c88c982b5ca2e9399ea4557df4ff74c37c4375b
+static/css/main.c091de39.chunk.css,1587501766946,2d7a4c693a74769193290d00086c4fd226aef672ef08799166398acec2da2b58
+static/css/main.c091de39.chunk.css.map,1587501766978,50a6aeb44b19dbc69200f437c82763d529f7949b319987734899db895d120c54
+static/js/2.e3b5c6e2.chunk.js.LICENSE.txt,1587501766976,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
+static/js/runtime-main.e13d1eff.js,1587501766977,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
+static/js/main.5b982c02.chunk.js,1587501766976,e02ec4336d5447ac219c7c8a3e383d4110270b5ba61475a0a0bb1f0ea874252b
+static/js/runtime-main.e13d1eff.js.map,1587501766977,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
+static/media/CNLOGO.c149ff8b.svg,1587501766946,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
+favicon_CN.ico,1587501737693,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
+static/css/2.47e06e2e.chunk.css,1587501766977,8ad0538bbe847d6fa20053ffe5499bf18f1ae13b691f0e893241495889b60abd
+static/js/main.5b982c02.chunk.js.map,1587501766977,bba39a790710d1d764ba7244f93f58c3ffba75c1771b74e5cf746fa6206d5ebb
+static/css/2.47e06e2e.chunk.css.map,1587501766977,dfcf2b2f517f64006f1d90fb3b9a0feb3d65e8725a3aa0ad70ca97f9c3b60283
+static/js/2.e3b5c6e2.chunk.js,1587501766947,f6b9084c2595120e1c748b53549cb9083fb39e10b92c9a96ef7e7f049da3827a
+static/js/2.e3b5c6e2.chunk.js.map,1587501766978,7e5c5ed4f06b0ae9c39b52c069b5b530763561ad05e443e0e627d8dde8dfeaa6
diff --git a/src/containers/App.css b/src/containers/App.css
index 21703f2..9427301 100644
--- a/src/containers/App.css
+++ b/src/containers/App.css
@@ -233,7 +233,7 @@ p {
font-weight: bold;
}
-/**** Spinning Logo ****/
+/**** Login Page Spinning Icon ****/
.lds-ring {
display: inline-block;
@@ -273,26 +273,46 @@ p {
}
}
-/**** Quick Access Classes ****/
+/**** Coding Page Spinning Icon ****/
-.padding-0-14 {
- padding: 0 14px;
+.lds-ring-coding {
+ display: inline-block;
+ width: 90px;
+ height: 90px;
+ position: absolute;
+ top: 40vh;
+ left: 46.5%;
+ z-index: 50;
+ text-align: center;
}
-
-.margin-l-20 {
- margin-left: 20px;
+.lds-ring-coding div {
+ box-sizing: border-box;
+ display: block;
+ position: absolute;
+ width: 80px;
+ height: 80px;
+ margin: 8px;
+ border: 8px solid #fff;
+ border-radius: 50%;
+ animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
+ border-color: #fff transparent transparent transparent;
}
-
-.margin-l-15 {
- margin-left: 15px;
+.lds-ring-coding div:nth-child(1) {
+ animation-delay: -0.45s;
}
-
-.margin-l-10 {
- margin-left: 10px;
+.lds-ring-coding div:nth-child(2) {
+ animation-delay: -0.3s;
}
-
-.text-center {
- text-align: center;
+.lds-ring-coding div:nth-child(3) {
+ animation-delay: -0.15s;
+}
+@keyframes lds-ring-coding {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
}
/**** Extra ****/
@@ -460,4 +480,26 @@ table tr {
.header-menu {
vertical-align: text-top;
+}
+
+/**** Quick Access Classes ****/
+
+.padding-0-14 {
+ padding: 0 14px;
+}
+
+.margin-l-20 {
+ margin-left: 20px;
+}
+
+.margin-l-15 {
+ margin-left: 15px;
+}
+
+.margin-l-10 {
+ margin-left: 10px;
+}
+
+.text-center {
+ text-align: center;
}
\ No newline at end of file
diff --git a/src/containers/pages/Coding.js b/src/containers/pages/Coding.js
index 9bc8c4e..9f90b24 100644
--- a/src/containers/pages/Coding.js
+++ b/src/containers/pages/Coding.js
@@ -41,15 +41,12 @@ export default class CodingPage extends React.Component {
// setting initial state
this.state = {
key: random.generate(3), // for storing connected-users
+ isLoading: true,
readOnly: false,
isCreator: false,
sideDrawerOpen: false,
mode: 'xml',
code: "Loading...",
- cursorPosition: {
- line: 0,
- ch: 0
- },
};
// set 'readOnly' state and session title from database
@@ -299,11 +296,8 @@ export default class CodingPage extends React.Component {
createdon: createdOnCompressed
});
- /**** TODO: ****/
- // this.codemirror.setValue("Loading...");
- // this.codemirror.setValue("");
-
this.firepad.on('ready', function() {
+ self.setState({isLoading: false});
if (self.firepad.isHistoryEmpty()) {
self.firepad.setText(self.state.code);
}
@@ -337,6 +331,8 @@ export default class CodingPage extends React.Component {
.catch(e => {
// no session found corresponding to "sessionid" passed in the params
this.firepad.dispose();
+ this.setState({isLoading: false});
+ this.sessionTitle.value = " ";
self.codemirror.setValue("No Session Found!");
});
@@ -425,6 +421,13 @@ export default class CodingPage extends React.Component {
}
+ // spinning loading icon
+ let spinningLogo;
+ if (this.state.isLoading) {
+ spinningLogo =
+
+ }
+
return (
@@ -492,6 +495,8 @@ export default class CodingPage extends React.Component {
}
/>
+ { spinningLogo }
+
{ backdrop }
diff --git a/src/containers/pages/Dashboard.js b/src/containers/pages/Dashboard.js
index 0b34bf7..586bb75 100644
--- a/src/containers/pages/Dashboard.js
+++ b/src/containers/pages/Dashboard.js
@@ -215,8 +215,6 @@ export default class Dashboard extends React.Component {
render() {
- // console.log("render() called!");
-
let loadingTextUserSession;
if(this.state.isLoadingUserSession){
loadingTextUserSession = Loading... ;
From 5f0eca31b13f097ca22ae9e7585ca77b8939e67d Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Wed, 22 Apr 2020 13:17:04 +0530
Subject: [PATCH 47/51] change firebase project
---
.firebase/hosting.YnVpbGQ.cache | 34 ++++++++++++++++-----------------
.firebaserc | 2 +-
database.rules.json | 1 -
3 files changed, 18 insertions(+), 19 deletions(-)
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
index dfaa099..3d4cede 100644
--- a/.firebase/hosting.YnVpbGQ.cache
+++ b/.firebase/hosting.YnVpbGQ.cache
@@ -1,17 +1,17 @@
-asset-manifest.json,1587501766946,97893db9d7ddc996e9a427f1f108efe462891f22ee85bc0a677663314d36269e
-precache-manifest.ac52202743a6fa0f77f1e7dbd156f9a4.js,1587501766943,f39489e5995cb1dced43d51c50ecca31f7766e0e3a8fee5e2030418e0578c50e
-index.html,1587501766942,271bc9beb6e73276b8ec472a8697cb0c069d70483d651de020002ca4a4f14735
-service-worker.js,1587501766943,b7806d71b76f2cdc893372fc3c88c982b5ca2e9399ea4557df4ff74c37c4375b
-static/css/main.c091de39.chunk.css,1587501766946,2d7a4c693a74769193290d00086c4fd226aef672ef08799166398acec2da2b58
-static/css/main.c091de39.chunk.css.map,1587501766978,50a6aeb44b19dbc69200f437c82763d529f7949b319987734899db895d120c54
-static/js/2.e3b5c6e2.chunk.js.LICENSE.txt,1587501766976,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-static/js/runtime-main.e13d1eff.js,1587501766977,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-static/js/main.5b982c02.chunk.js,1587501766976,e02ec4336d5447ac219c7c8a3e383d4110270b5ba61475a0a0bb1f0ea874252b
-static/js/runtime-main.e13d1eff.js.map,1587501766977,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/media/CNLOGO.c149ff8b.svg,1587501766946,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-favicon_CN.ico,1587501737693,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/css/2.47e06e2e.chunk.css,1587501766977,8ad0538bbe847d6fa20053ffe5499bf18f1ae13b691f0e893241495889b60abd
-static/js/main.5b982c02.chunk.js.map,1587501766977,bba39a790710d1d764ba7244f93f58c3ffba75c1771b74e5cf746fa6206d5ebb
-static/css/2.47e06e2e.chunk.css.map,1587501766977,dfcf2b2f517f64006f1d90fb3b9a0feb3d65e8725a3aa0ad70ca97f9c3b60283
-static/js/2.e3b5c6e2.chunk.js,1587501766947,f6b9084c2595120e1c748b53549cb9083fb39e10b92c9a96ef7e7f049da3827a
-static/js/2.e3b5c6e2.chunk.js.map,1587501766978,7e5c5ed4f06b0ae9c39b52c069b5b530763561ad05e443e0e627d8dde8dfeaa6
+asset-manifest.json,1587539889541,ddb7d8f95766f9e039e88e0bc67e716a9f9ae1ef5ff04dd210ed6cc869196d92
+precache-manifest.66b24774be4493b6e24d5e4693238d79.js,1587539889537,1dfb2b99381555c9ac508acb463550b8bb1e0f3503bde26fc1c738a47a8429b9
+index.html,1587539889537,a1171811be505900622c0855d23a814c63d10110f1aa43aa753261ad7d9d99ff
+service-worker.js,1587539889537,c29e1756fafbc6568a32d12def4db80feaf0c1d1411aea4ae65824f35dd13bce
+static/css/main.8d6ea9a4.chunk.css,1587539889569,c7f08b4348f10b2409bdd675771e6c18b084d3fc15e8e0845a27f989b36bcc85
+static/css/main.8d6ea9a4.chunk.css.map,1587539889573,dd48d0101d1a8d8da59e13fc1528e7315ac4d8b993997068456c4cb3ab2ae36d
+static/js/2.e58d2409.chunk.js.LICENSE.txt,1587539889571,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
+static/js/runtime-main.e13d1eff.js,1587539889538,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
+static/js/main.6a1649cd.chunk.js,1587539889571,61de51415d40ac44df46541c8f2fe145b67a982a90e0db7c0d53368efeeeb187
+static/js/runtime-main.e13d1eff.js.map,1587539889570,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
+static/media/CNLOGO.c149ff8b.svg,1587539889569,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
+favicon_CN.ico,1587539862488,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
+static/css/2.47e06e2e.chunk.css,1587539889572,8ad0538bbe847d6fa20053ffe5499bf18f1ae13b691f0e893241495889b60abd
+static/js/main.6a1649cd.chunk.js.map,1587539889571,10026238c6a902a439cc8cc4f5a18e3748f3487ae45b8ca0960b197fc09db92b
+static/css/2.47e06e2e.chunk.css.map,1587539889572,dfcf2b2f517f64006f1d90fb3b9a0feb3d65e8725a3aa0ad70ca97f9c3b60283
+static/js/2.e58d2409.chunk.js,1587539889570,7ef3bbed642ea4c57531ce033a0962bb67866908ed36d70b8164dfb58e1211cf
+static/js/2.e58d2409.chunk.js.map,1587539889571,c936dcb24c011f884daf5485530a3c64eb134f03d8999063f0061d2f0b6cf2f6
diff --git a/.firebaserc b/.firebaserc
index 865636a..c9627e4 100644
--- a/.firebaserc
+++ b/.firebaserc
@@ -1,5 +1,5 @@
{
"projects": {
- "default": "coderoom-aecd1"
+ "default": "coderoom-app"
}
}
diff --git a/database.rules.json b/database.rules.json
index f122d7b..b104e9c 100644
--- a/database.rules.json
+++ b/database.rules.json
@@ -1,5 +1,4 @@
{
- /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
"rules": {
".read": true,
".write": true
From e7d548237a42e7740670cdc65423007c99c79bfb Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Thu, 23 Apr 2020 23:24:07 +0530
Subject: [PATCH 48/51] update readme
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index d371b66..5608f3f 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
# Coderoom | Coding Ninjas
-### (http://coderoom-aecd1.firebaseapp.com)
+### (http://coderoom-app.firebaseapp.com)
A collaborative place for sharing code in realtime!
## To run the project (locally on your machine):
From 9e5e592e502f4f802805b9833388374dd28446c5 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Thu, 23 Apr 2020 23:29:33 +0530
Subject: [PATCH 49/51] update index.html
---
public/index.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/public/index.html b/public/index.html
index cf5bcb2..7c13a95 100644
--- a/public/index.html
+++ b/public/index.html
@@ -19,8 +19,8 @@
-
-
+
+
From 46d1004cc76fb99351bd34c7e91505ea30bd14cd Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Sat, 25 Apr 2020 13:00:00 +0530
Subject: [PATCH 50/51] add 'no session found' message in dashboard
---
.firebase/hosting.YnVpbGQ.cache | 34 +++++++++++++++----------------
src/containers/App.css | 4 ++++
src/containers/pages/Dashboard.js | 20 ++++++++++++++++++
3 files changed, 41 insertions(+), 17 deletions(-)
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
index 3d4cede..7fc203d 100644
--- a/.firebase/hosting.YnVpbGQ.cache
+++ b/.firebase/hosting.YnVpbGQ.cache
@@ -1,17 +1,17 @@
-asset-manifest.json,1587539889541,ddb7d8f95766f9e039e88e0bc67e716a9f9ae1ef5ff04dd210ed6cc869196d92
-precache-manifest.66b24774be4493b6e24d5e4693238d79.js,1587539889537,1dfb2b99381555c9ac508acb463550b8bb1e0f3503bde26fc1c738a47a8429b9
-index.html,1587539889537,a1171811be505900622c0855d23a814c63d10110f1aa43aa753261ad7d9d99ff
-service-worker.js,1587539889537,c29e1756fafbc6568a32d12def4db80feaf0c1d1411aea4ae65824f35dd13bce
-static/css/main.8d6ea9a4.chunk.css,1587539889569,c7f08b4348f10b2409bdd675771e6c18b084d3fc15e8e0845a27f989b36bcc85
-static/css/main.8d6ea9a4.chunk.css.map,1587539889573,dd48d0101d1a8d8da59e13fc1528e7315ac4d8b993997068456c4cb3ab2ae36d
-static/js/2.e58d2409.chunk.js.LICENSE.txt,1587539889571,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-static/js/runtime-main.e13d1eff.js,1587539889538,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-static/js/main.6a1649cd.chunk.js,1587539889571,61de51415d40ac44df46541c8f2fe145b67a982a90e0db7c0d53368efeeeb187
-static/js/runtime-main.e13d1eff.js.map,1587539889570,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/media/CNLOGO.c149ff8b.svg,1587539889569,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-favicon_CN.ico,1587539862488,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/css/2.47e06e2e.chunk.css,1587539889572,8ad0538bbe847d6fa20053ffe5499bf18f1ae13b691f0e893241495889b60abd
-static/js/main.6a1649cd.chunk.js.map,1587539889571,10026238c6a902a439cc8cc4f5a18e3748f3487ae45b8ca0960b197fc09db92b
-static/css/2.47e06e2e.chunk.css.map,1587539889572,dfcf2b2f517f64006f1d90fb3b9a0feb3d65e8725a3aa0ad70ca97f9c3b60283
-static/js/2.e58d2409.chunk.js,1587539889570,7ef3bbed642ea4c57531ce033a0962bb67866908ed36d70b8164dfb58e1211cf
-static/js/2.e58d2409.chunk.js.map,1587539889571,c936dcb24c011f884daf5485530a3c64eb134f03d8999063f0061d2f0b6cf2f6
+asset-manifest.json,1587738348322,42391fdb8868b5a50e4df59328d05f911ccf78fedcb2d49ec56ff41db4d93e92
+precache-manifest.377d9fd893a13ab0486645d4345fdc83.js,1587738348289,7049b9f9b5b81be65e841b69d4df9ffbe783f0a7d46db9348af41e04950ad526
+index.html,1587738348289,e0e10c90385a225e4a43ef337ab9e43c5ec6abd04d78467852055a6a00bcfb8f
+service-worker.js,1587738348289,555d44bb9901d6b62de909a70ca7cc4edd533cb1dabe543d6e916a66845364d6
+static/css/main.8d6ea9a4.chunk.css,1587738348294,c7f08b4348f10b2409bdd675771e6c18b084d3fc15e8e0845a27f989b36bcc85
+static/js/2.e58d2409.chunk.js.LICENSE.txt,1587738348324,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
+static/css/main.8d6ea9a4.chunk.css.map,1587738348323,dd48d0101d1a8d8da59e13fc1528e7315ac4d8b993997068456c4cb3ab2ae36d
+static/js/main.6a1649cd.chunk.js,1587738348292,61de51415d40ac44df46541c8f2fe145b67a982a90e0db7c0d53368efeeeb187
+static/js/runtime-main.e13d1eff.js,1587738348322,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
+static/js/runtime-main.e13d1eff.js.map,1587738348323,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
+static/media/CNLOGO.c149ff8b.svg,1587738348293,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
+favicon_CN.ico,1587738333172,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
+static/css/2.47e06e2e.chunk.css,1587738348323,8ad0538bbe847d6fa20053ffe5499bf18f1ae13b691f0e893241495889b60abd
+static/js/main.6a1649cd.chunk.js.map,1587738348323,10026238c6a902a439cc8cc4f5a18e3748f3487ae45b8ca0960b197fc09db92b
+static/css/2.47e06e2e.chunk.css.map,1587738348323,dfcf2b2f517f64006f1d90fb3b9a0feb3d65e8725a3aa0ad70ca97f9c3b60283
+static/js/2.e58d2409.chunk.js,1587738348324,7ef3bbed642ea4c57531ce033a0962bb67866908ed36d70b8164dfb58e1211cf
+static/js/2.e58d2409.chunk.js.map,1587738348326,c936dcb24c011f884daf5485530a3c64eb134f03d8999063f0061d2f0b6cf2f6
diff --git a/src/containers/App.css b/src/containers/App.css
index 9427301..fc1833b 100644
--- a/src/containers/App.css
+++ b/src/containers/App.css
@@ -157,6 +157,10 @@ p {
color: black;
}
+.btn-home:focus {
+ outline: none;
+}
+
.btn-coding {
display: inline-block;
margin-bottom: 0;
diff --git a/src/containers/pages/Dashboard.js b/src/containers/pages/Dashboard.js
index 586bb75..4c87756 100644
--- a/src/containers/pages/Dashboard.js
+++ b/src/containers/pages/Dashboard.js
@@ -20,6 +20,7 @@ export default class Dashboard extends React.Component {
isLoadingUserSession: true,
viewClonesHelpText: false,
isLoadingSessionClones: false,
+ noSessionFoundText: false,
noCloneFoundText: false,
};
@@ -57,6 +58,7 @@ export default class Dashboard extends React.Component {
.then(snapshot => {
// console.log("Searching for all sessions created by current user...");
userSessionsList.splice(0, userSessionsList.length);
+ let found = false;
let self = this;
let i = 0;
@@ -74,6 +76,8 @@ export default class Dashboard extends React.Component {
viewClonesHelpText: true,
});
+ found = true;
+
let sessionid = childSnapshot.key;
// console.log(`User session id: ${sessionid}`);
@@ -108,6 +112,15 @@ export default class Dashboard extends React.Component {
}
});
+
+ if(!found){
+ this.setState({
+ isLoadingUserSession: false,
+ noSessionFoundText: true,
+ });
+ // console.log("No clones found!");
+ }
+
// this.setState(this.state);
});
@@ -238,6 +251,12 @@ export default class Dashboard extends React.Component {
No Clones Found! ;
}
+ let noSessionFoundText;
+ if(this.state.noSessionFoundText){
+ noSessionFoundText =
+ No Sessions Found! ;
+ }
+
let usersSessionHeading;
let usersCloneHeading;
if(userDisplayName.name !== undefined){
@@ -277,6 +296,7 @@ export default class Dashboard extends React.Component {
{ loadingTextUserSession }
+ { noSessionFoundText }
{ usersCloneHeading }
From 830575ff11e02c5960b08f3f9e3d0bbff5e26913 Mon Sep 17 00:00:00 2001
From: Daksh Khetan <2012daksh@gmail.com>
Date: Sat, 25 Apr 2020 13:09:15 +0530
Subject: [PATCH 51/51] Delete hosting.YnVpbGQ.cache
---
.firebase/hosting.YnVpbGQ.cache | 17 -----------------
1 file changed, 17 deletions(-)
delete mode 100644 .firebase/hosting.YnVpbGQ.cache
diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache
deleted file mode 100644
index 7fc203d..0000000
--- a/.firebase/hosting.YnVpbGQ.cache
+++ /dev/null
@@ -1,17 +0,0 @@
-asset-manifest.json,1587738348322,42391fdb8868b5a50e4df59328d05f911ccf78fedcb2d49ec56ff41db4d93e92
-precache-manifest.377d9fd893a13ab0486645d4345fdc83.js,1587738348289,7049b9f9b5b81be65e841b69d4df9ffbe783f0a7d46db9348af41e04950ad526
-index.html,1587738348289,e0e10c90385a225e4a43ef337ab9e43c5ec6abd04d78467852055a6a00bcfb8f
-service-worker.js,1587738348289,555d44bb9901d6b62de909a70ca7cc4edd533cb1dabe543d6e916a66845364d6
-static/css/main.8d6ea9a4.chunk.css,1587738348294,c7f08b4348f10b2409bdd675771e6c18b084d3fc15e8e0845a27f989b36bcc85
-static/js/2.e58d2409.chunk.js.LICENSE.txt,1587738348324,a59751de43bebf1e734f41600b2bb03dcde3a18abea1c0474ef7ac60ff302b79
-static/css/main.8d6ea9a4.chunk.css.map,1587738348323,dd48d0101d1a8d8da59e13fc1528e7315ac4d8b993997068456c4cb3ab2ae36d
-static/js/main.6a1649cd.chunk.js,1587738348292,61de51415d40ac44df46541c8f2fe145b67a982a90e0db7c0d53368efeeeb187
-static/js/runtime-main.e13d1eff.js,1587738348322,1d2dbb0095a527cc8dcbb8746b42e14550f4543a28480671bc5821e47c552fd9
-static/js/runtime-main.e13d1eff.js.map,1587738348323,1b8351c356a25c434cb32880147976019bcc9e1553fad7e6afb83bee61160729
-static/media/CNLOGO.c149ff8b.svg,1587738348293,bd340e9acd31b3bdf5732250d141ccb8e2e6247670834b5605a10e4e91a5fb9f
-favicon_CN.ico,1587738333172,2f5e8db0721f2d0efe10f64b8099530466cedf37a9a92d57c3f7ed2b27ff8de5
-static/css/2.47e06e2e.chunk.css,1587738348323,8ad0538bbe847d6fa20053ffe5499bf18f1ae13b691f0e893241495889b60abd
-static/js/main.6a1649cd.chunk.js.map,1587738348323,10026238c6a902a439cc8cc4f5a18e3748f3487ae45b8ca0960b197fc09db92b
-static/css/2.47e06e2e.chunk.css.map,1587738348323,dfcf2b2f517f64006f1d90fb3b9a0feb3d65e8725a3aa0ad70ca97f9c3b60283
-static/js/2.e58d2409.chunk.js,1587738348324,7ef3bbed642ea4c57531ce033a0962bb67866908ed36d70b8164dfb58e1211cf
-static/js/2.e58d2409.chunk.js.map,1587738348326,c936dcb24c011f884daf5485530a3c64eb134f03d8999063f0061d2f0b6cf2f6