1
0
mirror of https://github.com/chinchang/web-maker.git synced 2025-07-31 18:50:14 +02:00

add poc for firestore

This commit is contained in:
Kushagra Gour
2018-01-06 03:48:28 +05:30
parent 7fa2e745b2
commit 0d84ded781
7 changed files with 220 additions and 54 deletions

View File

@@ -46,7 +46,7 @@
"new-parens": "error", "new-parens": "error",
"newline-after-var": "off", "newline-after-var": "off",
"newline-before-return": "off", "newline-before-return": "off",
"newline-per-chained-call": "error", "newline-per-chained-call": "off",
"no-alert": "off", "no-alert": "off",
"no-array-constructor": "error", "no-array-constructor": "error",
"no-bitwise": "off", "no-bitwise": "off",
@@ -201,6 +201,7 @@
"utils": true, "utils": true,
"Promise": true, "Promise": true,
"Inlet": true, "Inlet": true,
"db": true "db": true,
"firebase": true
} }
} }

View File

@@ -1,15 +1,51 @@
(() => { (() => {
const FAUX_DELAY = 1; const FAUX_DELAY = 1;
var db;
var dbPromise;
async function getDb() {
if (dbPromise) {
return dbPromise;
}
dbPromise = new Promise((resolve, reject) => {
if (db) {
return resolve(db);
}
firebase
.firestore()
.enablePersistence()
.then(function() {
// Initialize Cloud Firestore through firebase
db = firebase.firestore();
console.log('firebase db ready', db);
resolve(db);
})
.catch(function(err) {
reject(err.code);
if (err.code === 'failed-precondition') {
// Multiple tabs open, persistence can only be enabled
// in one tab at a a time.
// ...
} else if (err.code === 'unimplemented') {
// The current browser does not support all of the
// features required to enable persistence
// ...
}
});
});
return dbPromise;
}
var local = { var local = {
get: (obj, cb) => { get: (obj, cb) => {
if (typeof obj === 'string') {
const retVal = {}; const retVal = {};
if (typeof obj === 'string') {
retVal[obj] = JSON.parse(window.localStorage.getItem(obj)); retVal[obj] = JSON.parse(window.localStorage.getItem(obj));
setTimeout(() => cb(retVal), FAUX_DELAY); setTimeout(() => cb(retVal), FAUX_DELAY);
} else { } else {
const retVal = {};
Object.keys(obj).forEach(key => { Object.keys(obj).forEach(key => {
let val = window.localStorage.getItem(key); const val = window.localStorage.getItem(key);
retVal[key] = retVal[key] =
val === undefined || val === null ? obj[key] : JSON.parse(val); val === undefined || val === null ? obj[key] : JSON.parse(val);
}); });
@@ -21,11 +57,14 @@
window.localStorage.setItem(key, JSON.stringify(obj[key])); window.localStorage.setItem(key, JSON.stringify(obj[key]));
}); });
setTimeout(() => { setTimeout(() => {
if (cb) cb(); if (cb) {
cb();
}
}, FAUX_DELAY); }, FAUX_DELAY);
} }
}; };
window.db = { window.db = {
getDb,
local: chrome && chrome.storage ? chrome.storage.local : local, local: chrome && chrome.storage ? chrome.storage.local : local,
sync: chrome && chrome.storage ? chrome.storage.sync : local sync: chrome && chrome.storage ? chrome.storage.sync : local
}; };

View File

@@ -580,10 +580,12 @@
<script src="lib/split.js"></script> <script src="lib/split.js"></script>
<script src="lib/inlet.min.js"></script> <script src="lib/inlet.min.js"></script>
<script src="lib/esprima.js"></script> <script src="lib/esprima.js"></script>
<script src="https://www.gstatic.com/firebasejs/4.8.1/firebase.js"></script>
<script src="https://www.gstatic.com/firebasejs/4.8.1/firebase-firestore.js"></script>
<!-- endbuild --> <!-- endbuild -->
<!-- build:js script.js --> <!-- build:js script.js -->
<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="analytics.js"></script> <script src="analytics.js"></script>
@@ -592,6 +594,7 @@
<script src="notifications.js"></script> <script src="notifications.js"></script>
<script src="library-list.js"></script> <script src="library-list.js"></script>
<script src="textarea-autocomplete.js"></script> <script src="textarea-autocomplete.js"></script>
<script src="itemService.js"></script>
<script src="script.js"></script> <script src="script.js"></script>
<script src="dropdown.js"></script> <script src="dropdown.js"></script>
<!-- endbuild --> <!-- endbuild -->

66
src/itemService.js Normal file
View File

@@ -0,0 +1,66 @@
(() => {
window.itemService = {
async getItem(id) {
var db = await window.db.getDb();
return db.doc(`items/${id}`).get().then(doc => {
return doc.data();
});
},
async getAllItems() {
var db = await window.db.getDb();
return db
.doc(`users/${window.user.uid}`)
.get()
.then(doc => {
return doc.data().items;
})
.then(async itemIds => {
console.log('itemids', itemIds);
var items = [];
for (var id in itemIds) {
var item = await this.getItem(id);
items.push(item);
}
return items;
});
},
async setUser() {
var db = await window.db.getDb();
return db.doc(`users/${window.user.uid}`).set({
items: {}
});
},
async setItem(id, item) {
var db = await window.db.getDb();
console.log(`Starting to save item ${id}`);
return db
.collection('items')
.doc(id)
.set(item, {
merge: true
})
.then(arg => {
console.log('Document written', arg);
})
.catch(error => console.log(error));
},
async setItemForUser(itemId) {
var db = await window.db.getDb();
return db
.collection('users')
.doc(window.user.uid)
.update({
[`items.${itemId}`]: true
})
.then(arg => {
console.log(`Item ${itemId} set for user`, arg);
})
.catch(error => console.log(error));
}
};
})();

View File

@@ -10,7 +10,7 @@ customEditorFontInput, cssSettingsModal, cssSettingsBtn, acssSettingsTextarea,
globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
*/ */
/* eslint-disable no-extra-semi */ /* eslint-disable no-extra-semi */
(function(alertsService) { (function(alertsService, itemService) {
/* eslint-enable no-extra-semi */ /* eslint-enable no-extra-semi */
var scope = scope || {}; var scope = scope || {};
var version = '2.9.6'; var version = '2.9.6';
@@ -323,6 +323,10 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
}); });
// Push into the items hash if its a new item being saved // Push into the items hash if its a new item being saved
if (isNewItem) { if (isNewItem) {
if (!window.IS_EXTENSION) {
itemService.setItemForUser(currentItem.id);
return;
}
db.local.get( db.local.get(
{ {
items: {} items: {}
@@ -408,7 +412,8 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
currentItem.mainSizes = getMainPaneSizes(); currentItem.mainSizes = getMainPaneSizes();
utils.log('saving key', key || currentItem.id, currentItem); utils.log('saving key', key || currentItem.id, currentItem);
return saveSetting(key || currentItem.id, currentItem).then(() => { saveSetting(key || currentItem.id, currentItem);
return itemService.setItem(key || currentItem.id, currentItem).then(() => {
alertsService.add('Item saved.'); alertsService.add('Item saved.');
unsavedEditCount = 0; unsavedEditCount = 0;
saveBtn.classList.remove('is-marked'); saveBtn.classList.remove('is-marked');
@@ -472,16 +477,26 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
* @param {boolean} shouldSaveGlobally Whether to store the fetched items in global arr for later use. * @param {boolean} shouldSaveGlobally Whether to store the fetched items in global arr for later use.
* @return {promise} Promise. * @return {promise} Promise.
*/ */
function fetchItems(shouldSaveGlobally) { async function fetchItems(shouldSaveGlobally) {
var d = deferred(); var d = deferred();
savedItems = savedItems || {};
var items = [];
if (!window.IS_EXTENSION) {
items = await itemService.getAllItems();
if (shouldSaveGlobally) {
items.forEach(item => {
savedItems[item.id] = item;
});
}
d.resolve(items);
return d.promise;
}
db.local.get('items', function(result) { db.local.get('items', function(result) {
var itemIds = Object.getOwnPropertyNames(result.items || {}), var itemIds = Object.getOwnPropertyNames(result.items || {});
items = [];
if (!itemIds.length) { if (!itemIds.length) {
d.resolve([]); d.resolve([]);
} }
savedItems = savedItems || {};
trackEvent('fn', 'fetchItems', itemIds.length); trackEvent('fn', 'fetchItems', itemIds.length);
for (let i = 0; i < itemIds.length; i++) { for (let i = 0; i < itemIds.length; i++) {
/* eslint-disable no-loop-func */ /* eslint-disable no-loop-func */
@@ -1996,7 +2011,43 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
e.preventDefault(); e.preventDefault();
}; };
scope.login = function(e) {
var config = {
apiKey: 'AIzaSyBl8Dz7ZOE7aP75mipYl2zKdLSRzBU2fFc',
authDomain: 'web-maker-app.firebaseapp.com',
databaseURL: 'https://web-maker-app.firebaseio.com',
projectId: 'web-maker-app',
storageBucket: 'web-maker-app.appspot.com',
messagingSenderId: '560473480645'
};
firebase.initializeApp(config);
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
utils.log(user);
scope.user = window.user = user;
// itemService.setUser();
// ...
} else {
// User is signed out.
// ...
}
// ...
});
firebase.auth().signInAnonymously().then().catch(function(error) {
// Handle Errors here.
utils.log(error);
});
if (e) {
e.preventDefault();
}
};
function init() { function init() {
scope.login();
var lastCode; var lastCode;
CodeMirror.modeURL = `lib/codemirror/mode/%N/%N.js`; CodeMirror.modeURL = `lib/codemirror/mode/%N/%N.js`;
@@ -2514,4 +2565,4 @@ globalConsoleContainerEl, externalLibrarySearchInput, keyboardShortcutsModal
scope.closeAllOverlays = closeAllOverlays; scope.closeAllOverlays = closeAllOverlays;
init(); init();
})(window.alertsService); })(window.alertsService, window.itemService);

View File

@@ -15,7 +15,6 @@
*/ */
/* eslint-env browser */ /* eslint-env browser */
'use strict';
if ('serviceWorker' in navigator) { if ('serviceWorker' in navigator) {
// Delay registration until after the page has loaded, to ensure that our // Delay registration until after the page has loaded, to ensure that our
@@ -26,7 +25,9 @@ if ('serviceWorker' in navigator) {
// It won't be able to control pages unless it's located at the same level or higher than them. // It won't be able to control pages unless it's located at the same level or higher than them.
// *Don't* register service worker file in, e.g., a scripts/ sub-directory! // *Don't* register service worker file in, e.g., a scripts/ sub-directory!
// See https://github.com/slightlyoff/ServiceWorker/issues/468 // See https://github.com/slightlyoff/ServiceWorker/issues/468
navigator.serviceWorker.register('service-worker.js').then(function(reg) { navigator.serviceWorker
.register('service-worker.js')
.then(function(reg) {
// updatefound is fired if service-worker.js changes. // updatefound is fired if service-worker.js changes.
reg.onupdatefound = function() { reg.onupdatefound = function() {
// The updatefound event implies that reg.installing is set; see // The updatefound event implies that reg.installing is set; see
@@ -50,12 +51,15 @@ if ('serviceWorker' in navigator) {
break; break;
case 'redundant': case 'redundant':
console.error('The installing service worker became redundant.'); console.error(
'The installing service worker became redundant.'
);
break; break;
} }
}; };
}; };
}).catch(function(e) { })
.catch(function(e) {
console.error('Error during service worker registration:', e); console.error('Error during service worker registration:', e);
}); });
}); });

View File

@@ -183,4 +183,6 @@
window.chrome = window.chrome || {}; window.chrome = window.chrome || {};
window.chrome.i18n = { getMessage: () => {} }; window.chrome.i18n = { getMessage: () => {} };
window.IS_EXTENSION = !!window.chrome.extension;
})(); })();