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:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
47
src/db.js
47
src/db.js
@@ -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
|
||||||
};
|
};
|
||||||
|
@@ -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
66
src/itemService.js
Normal 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));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -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;
|
||||||
})();
|
})();
|
||||||
|
Reference in New Issue
Block a user