mirror of
https://github.com/chinchang/web-maker.git
synced 2025-07-13 01:56:24 +02:00
login flow - first draft
This commit is contained in:
@ -19,7 +19,7 @@
|
|||||||
"computed-property-spacing": ["error", "never"],
|
"computed-property-spacing": ["error", "never"],
|
||||||
"consistent-return": "error",
|
"consistent-return": "error",
|
||||||
"consistent-this": "off",
|
"consistent-this": "off",
|
||||||
"curly": "error",
|
"curly": "off",
|
||||||
"default-case": "error",
|
"default-case": "error",
|
||||||
"dot-location": ["error", "property"],
|
"dot-location": ["error", "property"],
|
||||||
"dot-notation": "error",
|
"dot-notation": "error",
|
||||||
|
66
src/auth.js
Normal file
66
src/auth.js
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
window.logout = function logout() {
|
||||||
|
firebase.auth().signOut();
|
||||||
|
};
|
||||||
|
function login(providerName) {
|
||||||
|
var provider;
|
||||||
|
if (providerName === 'fb') {
|
||||||
|
provider = new firebase.auth.FacebookAuthProvider();
|
||||||
|
} else if (providerName === 'twitter') {
|
||||||
|
provider = new firebase.auth.TwitterAuthProvider();
|
||||||
|
} else if (providerName === 'google') {
|
||||||
|
provider = new firebase.auth.GoogleAuthProvider();
|
||||||
|
provider.addScope('https://www.googleapis.com/auth/userinfo.profile');
|
||||||
|
} else {
|
||||||
|
provider = new firebase.auth.GithubAuthProvider();
|
||||||
|
}
|
||||||
|
|
||||||
|
return firebase
|
||||||
|
.auth()
|
||||||
|
.signInWithPopup(provider)
|
||||||
|
.then(function(result) {
|
||||||
|
return;
|
||||||
|
// Save this user in the store
|
||||||
|
firebase
|
||||||
|
.database()
|
||||||
|
.ref('users/' + result.user.uid)
|
||||||
|
.update({
|
||||||
|
displayName: result.user.displayName,
|
||||||
|
email: result.user.email,
|
||||||
|
photoURL: result.user.providerData[0].photoURL,
|
||||||
|
signedUpOn: Date.now()
|
||||||
|
})
|
||||||
|
.then(function() {
|
||||||
|
// Port items in localstorage to user account
|
||||||
|
if (window.localStorage.prototyp) {
|
||||||
|
var items = JSON.parse(window.localStorage.prototyp);
|
||||||
|
var newItemKey;
|
||||||
|
items.forEach(function(localItem) {
|
||||||
|
itemService.fetchItem(localItem.id).then(function(item) {
|
||||||
|
newItemKey = firebase.database().ref('pens').push().key;
|
||||||
|
item.createdBy = result.user.uid;
|
||||||
|
delete item.uid;
|
||||||
|
firebase.database().ref('pens/' + newItemKey).set(item);
|
||||||
|
firebase
|
||||||
|
.database()
|
||||||
|
.ref('users/' + result.user.uid)
|
||||||
|
.child('items')
|
||||||
|
.child(newItemKey)
|
||||||
|
.set(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
delete localStorage.prototyp;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(function(error) {
|
||||||
|
// Handle Errors here.
|
||||||
|
var errorCode = error.code;
|
||||||
|
var errorMessage = error.message;
|
||||||
|
// The email of the user's account used.
|
||||||
|
var email = error.email;
|
||||||
|
// The firebase.auth.AuthCredential type that was used.
|
||||||
|
var credential = error.credential;
|
||||||
|
console.log(error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
window.login = login;
|
11
src/db.js
11
src/db.js
@ -86,7 +86,7 @@
|
|||||||
// Not critical right now.
|
// Not critical right now.
|
||||||
}
|
}
|
||||||
|
|
||||||
async function setUserLastSeenVersion(user, version) {
|
async function setUserLastSeenVersion(version) {
|
||||||
if (window.IS_EXTENSION) {
|
if (window.IS_EXTENSION) {
|
||||||
chrome.storage.sync.set(
|
chrome.storage.sync.set(
|
||||||
{
|
{
|
||||||
@ -99,17 +99,22 @@
|
|||||||
// Settings the lastSeenVersion in localStorage also because next time we need
|
// Settings the lastSeenVersion in localStorage also because next time we need
|
||||||
// to fetch it irrespective of the user being logged in or out
|
// to fetch it irrespective of the user being logged in or out
|
||||||
local.set({ lastSeenVersion: version });
|
local.set({ lastSeenVersion: version });
|
||||||
if (user) {
|
if (window.user) {
|
||||||
const remoteDb = await getDb();
|
const remoteDb = await getDb();
|
||||||
remoteDb.doc(`users/${user.uid}`).update({ lastSeenVersion: version });
|
remoteDb
|
||||||
|
.doc(`users/${window.user.uid}`)
|
||||||
|
.update({ lastSeenVersion: version });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getUser(userId) {
|
async function getUser(userId) {
|
||||||
const remoteDb = await getDb();
|
const remoteDb = await getDb();
|
||||||
return remoteDb.doc(`users/${userId}`).get().then(doc => {
|
return remoteDb.doc(`users/${userId}`).get().then(doc => {
|
||||||
|
if (!doc.exists)
|
||||||
|
return remoteDb.doc(`users/${userId}`).set({}, { merge: true });
|
||||||
const user = doc.data();
|
const user = doc.data();
|
||||||
Object.assign(window.user, user);
|
Object.assign(window.user, user);
|
||||||
|
return user;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,8 +73,14 @@
|
|||||||
<path d="M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z" />
|
<path d="M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z" />
|
||||||
</svg>Open
|
</svg>Open
|
||||||
</a>
|
</a>
|
||||||
<a>
|
<a class="hide-on-login flex flex-v-center hint--rounded hint--bottom-left" aria-label="Login/Signup" d-open-modal="loginModal">
|
||||||
<img width="20" src="https://www.gravatar.com/avatar/6be4e636e8aacd405bed5cd15124a875" class="main-header__avatar-img"/>
|
Login/Signup
|
||||||
|
</a>
|
||||||
|
<a class="hide-on-logout flex flex-v-center hint--rounded hint--bottom-left" aria-label="Logout" d-click="logout">
|
||||||
|
Logout
|
||||||
|
</a>
|
||||||
|
<a class="hide-on-logout">
|
||||||
|
<img id="headerAvatarImg" width="20" src="https://www.gravatar.com/avatar/6be4e636e8aacd405bed5cd15124a875" class="main-header__avatar-img"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -318,6 +324,10 @@
|
|||||||
<div class="modal__content" d-html="partials/onboard-modal.html"></div>
|
<div class="modal__content" d-html="partials/onboard-modal.html"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="modal" id="loginModal">
|
||||||
|
<div class="modal__content" d-html="partials/login-modal.html"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="modal modal--settings" id="settingsModal">
|
<div class="modal modal--settings" id="settingsModal">
|
||||||
<div class="modal__content">
|
<div class="modal__content">
|
||||||
<a d-click="onModalCloseBtnClick" href="" aria-label="Close Settings" title="Close" class="js-modal__close-btn modal__close-btn">
|
<a d-click="onModalCloseBtnClick" href="" aria-label="Close Settings" title="Close" class="js-modal__close-btn modal__close-btn">
|
||||||
@ -591,6 +601,7 @@
|
|||||||
<!-- <script src="service-worker-registration.js"></script> -->
|
<!-- <script src="service-worker-registration.js"></script> -->
|
||||||
<script src="utils.js"></script>
|
<script src="utils.js"></script>
|
||||||
<script src="db.js"></script>
|
<script src="db.js"></script>
|
||||||
|
<script src="auth.js"></script>
|
||||||
<script src="analytics.js"></script>
|
<script src="analytics.js"></script>
|
||||||
<script src="deferred.js"></script>
|
<script src="deferred.js"></script>
|
||||||
<script src="loader.js"></script>
|
<script src="loader.js"></script>
|
||||||
|
@ -7,13 +7,16 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
async getUserItemIds() {
|
async getUserItemIds() {
|
||||||
if (window.user && window.user.items) {
|
if (window.user) {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
resolve(window.user.items);
|
resolve(window.user.items || {});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
var remoteDb = await window.db.getDb();
|
var remoteDb = await window.db.getDb();
|
||||||
return remoteDb.doc(`users/${window.user.uid}`).get().then(doc => {
|
return remoteDb.doc(`users/${window.user.uid}`).get().then(doc => {
|
||||||
|
if (!doc.exists) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
return doc.data().items;
|
return doc.data().items;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -51,6 +54,9 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
async setItem(id, item) {
|
async setItem(id, item) {
|
||||||
|
if (!window.user) {
|
||||||
|
return new Promise(resolve => resolve());
|
||||||
|
}
|
||||||
var remoteDb = await window.db.getDb();
|
var remoteDb = await window.db.getDb();
|
||||||
console.log(`Starting to save item ${id}`);
|
console.log(`Starting to save item ${id}`);
|
||||||
item.createdBy = window.user.uid;
|
item.createdBy = window.user.uid;
|
||||||
@ -130,7 +136,7 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
async setItemForUser(itemId) {
|
async setItemForUser(itemId) {
|
||||||
if (window.IS_EXTENSION) {
|
if (window.IS_EXTENSION || !window.user) {
|
||||||
return window.db.local.get(
|
return window.db.local.get(
|
||||||
{
|
{
|
||||||
items: {}
|
items: {}
|
||||||
@ -152,6 +158,8 @@
|
|||||||
})
|
})
|
||||||
.then(arg => {
|
.then(arg => {
|
||||||
console.log(`Item ${itemId} set for user`, arg);
|
console.log(`Item ${itemId} set for user`, arg);
|
||||||
|
window.user.items = window.user.items || {};
|
||||||
|
window.user.items[itemId] = true;
|
||||||
})
|
})
|
||||||
.catch(error => console.log(error));
|
.catch(error => console.log(error));
|
||||||
},
|
},
|
||||||
|
@ -7,7 +7,8 @@ onboardModal, settingsModal, notificationsBtn, onboardShowInTabOptionBtn, editor
|
|||||||
onboardDontShowInTabOptionBtn, TextareaAutoComplete, savedItemCountEl, indentationSizeValueEl,
|
onboardDontShowInTabOptionBtn, TextareaAutoComplete, savedItemCountEl, indentationSizeValueEl,
|
||||||
runBtn, searchInput, consoleEl, consoleLogEl, logCountEl, fontStyleTag, fontStyleTemplate,
|
runBtn, searchInput, consoleEl, consoleLogEl, logCountEl, fontStyleTag, fontStyleTemplate,
|
||||||
customEditorFontInput, cssSettingsModal, cssSettingsBtn, acssSettingsTextarea,
|
customEditorFontInput, cssSettingsModal, cssSettingsBtn, acssSettingsTextarea,
|
||||||
globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
|
globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal, headerAvatarImg,
|
||||||
|
loginModal
|
||||||
*/
|
*/
|
||||||
/* eslint-disable no-extra-semi */
|
/* eslint-disable no-extra-semi */
|
||||||
(function(alertsService, itemService) {
|
(function(alertsService, itemService) {
|
||||||
@ -490,7 +491,7 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
|
|||||||
var d = deferred();
|
var d = deferred();
|
||||||
savedItems = savedItems || {};
|
savedItems = savedItems || {};
|
||||||
var items = [];
|
var items = [];
|
||||||
if (!window.IS_EXTENSION) {
|
if (!window.IS_EXTENSION && window.user) {
|
||||||
items = await itemService.getAllItems();
|
items = await itemService.getAllItems();
|
||||||
|
|
||||||
if (shouldSaveGlobally) {
|
if (shouldSaveGlobally) {
|
||||||
@ -667,6 +668,7 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
|
|||||||
settingsModal.classList.remove('is-modal-visible');
|
settingsModal.classList.remove('is-modal-visible');
|
||||||
cssSettingsModal.classList.remove('is-modal-visible');
|
cssSettingsModal.classList.remove('is-modal-visible');
|
||||||
keyboardShortcutsModal.classList.remove('is-modal-visible');
|
keyboardShortcutsModal.classList.remove('is-modal-visible');
|
||||||
|
loginModal.classList.remove('is-modal-visible');
|
||||||
toggleSavedItemsPane(false);
|
toggleSavedItemsPane(false);
|
||||||
document.dispatchEvent(new Event('overlaysClosed'));
|
document.dispatchEvent(new Event('overlaysClosed'));
|
||||||
}
|
}
|
||||||
@ -1094,7 +1096,8 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
|
|||||||
}
|
}
|
||||||
|
|
||||||
function createPreviewFile(html, css, js) {
|
function createPreviewFile(html, css, js) {
|
||||||
const shouldInlineJs = !window.webkitRequestFileSystem;
|
const shouldInlineJs =
|
||||||
|
!window.webkitRequestFileSystem || !window.IS_EXTENSION;
|
||||||
var contents = getCompleteHtml(html, css, shouldInlineJs ? js : null);
|
var contents = getCompleteHtml(html, css, shouldInlineJs ? js : null);
|
||||||
var blob = new Blob([contents], { type: 'text/plain;charset=UTF-8' });
|
var blob = new Blob([contents], { type: 'text/plain;charset=UTF-8' });
|
||||||
var blobjs = new Blob([js], { type: 'text/plain;charset=UTF-8' });
|
var blobjs = new Blob([js], { type: 'text/plain;charset=UTF-8' });
|
||||||
@ -1707,21 +1710,26 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
|
|||||||
utils.log(settingName, el.type === 'checkbox' ? el.checked : el.value);
|
utils.log(settingName, el.type === 'checkbox' ? el.checked : el.value);
|
||||||
prefs[settingName] = el.type === 'checkbox' ? el.checked : el.value;
|
prefs[settingName] = el.type === 'checkbox' ? el.checked : el.value;
|
||||||
obj[settingName] = prefs[settingName];
|
obj[settingName] = prefs[settingName];
|
||||||
|
|
||||||
|
// In case of !extension, we save in localstorage so that it gets fetched
|
||||||
|
// faster on future loads.
|
||||||
db.sync.set(obj, function() {
|
db.sync.set(obj, function() {
|
||||||
alertsService.add('Setting saved');
|
alertsService.add('Setting saved');
|
||||||
});
|
});
|
||||||
window.db.getDb().then(remoteDb => {
|
if (!window.IS_EXTENSION) {
|
||||||
remoteDb
|
window.db.getDb().then(remoteDb => {
|
||||||
.collection('users')
|
remoteDb
|
||||||
.doc(window.user.uid)
|
.collection('users')
|
||||||
.update({
|
.doc(window.user.uid)
|
||||||
[`settings.${settingName}`]: prefs[settingName]
|
.update({
|
||||||
})
|
[`settings.${settingName}`]: prefs[settingName]
|
||||||
.then(arg => {
|
})
|
||||||
console.log(`Setting "${settingName}" for user`, arg);
|
.then(arg => {
|
||||||
})
|
console.log(`Setting "${settingName}" for user`, arg);
|
||||||
.catch(error => console.log(error));
|
})
|
||||||
});
|
.catch(error => console.log(error));
|
||||||
|
});
|
||||||
|
}
|
||||||
trackEvent('ui', 'updatePref-' + settingName, prefs[settingName]);
|
trackEvent('ui', 'updatePref-' + settingName, prefs[settingName]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2011,7 +2019,17 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
};
|
};
|
||||||
|
|
||||||
scope.login = function(e) {
|
scope.updateProfileUi = () => {
|
||||||
|
if (window.user) {
|
||||||
|
document.body.classList.add('is-logged-in');
|
||||||
|
headerAvatarImg.src = window.user.photoURL;
|
||||||
|
} else {
|
||||||
|
document.body.classList.remove('is-logged-in');
|
||||||
|
headerAvatarImg.src = '';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
scope.login = e => {
|
||||||
firebase.auth().signInAnonymously().then().catch(function(error) {
|
firebase.auth().signInAnonymously().then().catch(function(error) {
|
||||||
// Handle Errors here.
|
// Handle Errors here.
|
||||||
utils.log(error);
|
utils.log(error);
|
||||||
@ -2021,6 +2039,8 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
scope.login = window.login;
|
||||||
|
scope.logout = window.logout;
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
var config = {
|
var config = {
|
||||||
@ -2034,17 +2054,23 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
|
|||||||
firebase.initializeApp(config);
|
firebase.initializeApp(config);
|
||||||
|
|
||||||
firebase.auth().onAuthStateChanged(function(user) {
|
firebase.auth().onAuthStateChanged(function(user) {
|
||||||
|
scope.closeAllOverlays();
|
||||||
if (user) {
|
if (user) {
|
||||||
utils.log('You are -> ', user);
|
utils.log('You are -> ', user);
|
||||||
|
alertsService.add('You are now logged in!');
|
||||||
scope.user = window.user = user;
|
scope.user = window.user = user;
|
||||||
window.db.getUser(user.uid).then(() => {
|
window.db.getUser(user.uid).then(customUser => {
|
||||||
Object.assign(prefs, user.settings);
|
if (customUser) {
|
||||||
updateSettingsInUi();
|
Object.assign(prefs, user.settings);
|
||||||
scope.updateSetting();
|
updateSettingsInUi();
|
||||||
|
scope.updateSetting();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
delete window.user;
|
||||||
// User is signed out.
|
// User is signed out.
|
||||||
}
|
}
|
||||||
|
scope.updateProfileUi();
|
||||||
});
|
});
|
||||||
|
|
||||||
var lastCode;
|
var lastCode;
|
||||||
@ -2073,7 +2099,7 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
|
|||||||
) {
|
) {
|
||||||
hasSeenNotifications = true;
|
hasSeenNotifications = true;
|
||||||
notificationsBtn.classList.remove('has-new');
|
notificationsBtn.classList.remove('has-new');
|
||||||
window.db.setUserLastSeenVersion(window.user.uid, version);
|
window.db.setUserLastSeenVersion(version);
|
||||||
}
|
}
|
||||||
trackEvent('ui', 'notificationButtonClick', version);
|
trackEvent('ui', 'notificationButtonClick', version);
|
||||||
return false;
|
return false;
|
||||||
@ -2382,9 +2408,11 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
|
|||||||
if (lastCode.id) {
|
if (lastCode.id) {
|
||||||
// Ignore for remote db
|
// Ignore for remote db
|
||||||
db.local.get(lastCode.id, function(itemResult) {
|
db.local.get(lastCode.id, function(itemResult) {
|
||||||
utils.log('Load item ', lastCode.id);
|
if (itemResult[lastCode.id]) {
|
||||||
currentItem = itemResult[lastCode.id];
|
utils.log('Load item ', lastCode.id);
|
||||||
refreshEditor();
|
currentItem = itemResult[lastCode.id];
|
||||||
|
refreshEditor();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
utils.log('Load last unsaved item', lastCode);
|
utils.log('Load last unsaved item', lastCode);
|
||||||
@ -2409,7 +2437,7 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
|
|||||||
trackEvent('ui', 'onboardModalSeen', version);
|
trackEvent('ui', 'onboardModalSeen', version);
|
||||||
document.cookie = 'onboarded=1';
|
document.cookie = 'onboarded=1';
|
||||||
}
|
}
|
||||||
window.db.setUserLastSeenVersion(window.user, version);
|
window.db.setUserLastSeenVersion(version);
|
||||||
// set some initial preferences on closing the onboard modal
|
// set some initial preferences on closing the onboard modal
|
||||||
// Old onboarding.
|
// Old onboarding.
|
||||||
// utils.once(document, 'overlaysClosed', function() {});
|
// utils.once(document, 'overlaysClosed', function() {});
|
||||||
|
@ -959,6 +959,11 @@ transition: 0.25s ease;
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.is-logged-in .hide-on-login,
|
||||||
|
body:not(.is-logged-in) .hide-on-logout {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
/* Codemirror themes basic bg styles. This is here so that there is no big FOUC
|
/* Codemirror themes basic bg styles. This is here so that there is no big FOUC
|
||||||
while the theme CSS file is loading */
|
while the theme CSS file is loading */
|
||||||
.cm-s-paraiso-dark.CodeMirror { background: #2f1e2e; color: #b9b6b0; }
|
.cm-s-paraiso-dark.CodeMirror { background: #2f1e2e; color: #b9b6b0; }
|
||||||
|
Reference in New Issue
Block a user