solid-ui
Version:
UI library for writing Solid read-write-web applications
424 lines (344 loc) • 14.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.findBookmarkDocument = findBookmarkDocument;
exports.toggleBookmark = toggleBookmark;
exports.renderBookmarksButton = renderBookmarksButton;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _index = require("../authn/index");
var debug = _interopRequireWildcard(require("../debug"));
var _iconBase = require("../iconBase");
var _logic = require("../logic");
var _index2 = require("../media/index");
var ns = _interopRequireWildcard(require("../ns"));
var pad = _interopRequireWildcard(require("../pad"));
var rdf = _interopRequireWildcard(require("rdflib"));
var style = _interopRequireWildcard(require("../style"));
var utils = _interopRequireWildcard(require("../utils"));
var widgets = _interopRequireWildcard(require("../widgets"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
/**
* Functions related to chat and bookmarks
* @packageDocumentation
*/
/* global alert confirm */
// pull in first avoid cross-refs
var UI = {
authn: _index.authn,
icons: _iconBase.icons,
ns: ns,
media: _index2.media,
pad: pad,
rdf: rdf,
store: _logic.store,
style: style,
utils: utils,
widgets: widgets
};
var $rdf = UI.rdf;
var BOOK = $rdf.Namespace('http://www.w3.org/2002/01/bookmark#');
var BOOKMARK_ICON = 'noun_45961.svg';
var kb = _logic.store;
var label = utils.label;
var dom = window.document || null;
/** Create a resource if it really does not exist
* Be absolutely sure something does not exist before creating a new empty file
* as otherwise existing could be deleted.
* @param doc {NamedNode} - The resource
*/
function createIfNotExists(doc) {
return new Promise(function (resolve, reject) {
kb.fetcher.load(doc).then(function (response) {
debug.log('createIfNotExists doc exists, all good ' + doc); // kb.fetcher.webOperation('HEAD', doc.uri).then(response => {
resolve(response);
}, function (err) {
if (err.response.status === 404) {
debug.log('createIfNotExists doc does NOT exist, will create... ' + doc);
kb.fetcher.webOperation('PUT', doc.uri, {
data: '',
contentType: 'text/turtle'
}).then(function (response) {
// fetcher.requested[doc.uri] = 'done' // do not need to read ?? but no headers
delete kb.fetcher.requested[doc.uri]; // delete cached 404 error
debug.log('createIfNotExists doc created ok ' + doc);
resolve(response);
}, function (err) {
debug.log('createIfNotExists doc FAILED: ' + doc + ': ' + err);
reject(err);
});
} else {
debug.log('createIfNotExists doc load error NOT 404: ' + doc + ': ' + err);
reject(err);
}
});
});
} // @@@@ use the one in rdflib.js when it is avaiable and delete this
function updatePromise(del, ins) {
return new Promise(function (resolve, reject) {
kb.updater.update(del, ins, function (uri, ok, errorBody) {
if (!ok) {
reject(new Error(errorBody));
} else {
resolve();
}
}); // callback
}); // promise
} // export findBookmarkDocument,
/* Bookmarking
*/
/** Find a user's bookmarks
*/
function findBookmarkDocument(_x) {
return _findBookmarkDocument.apply(this, arguments);
}
/** Add a bookmark
*/
function _findBookmarkDocument() {
_findBookmarkDocument = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(userContext) {
var theClass, fileTail, isPublic, newBookmarkFile;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
theClass = BOOK('Bookmark');
fileTail = 'bookmarks.ttl';
isPublic = true;
_context.next = 5;
return UI.authn.findAppInstances(userContext, theClass, isPublic);
case 5:
if (!(userContext.instances && userContext.instances.length > 0)) {
_context.next = 10;
break;
}
userContext.bookmarkDocument = userContext.instances[0];
if (userContext.instances.length > 1) {
alert('More than one bookmark file! ' + userContext.instances);
}
_context.next = 28;
break;
case 10:
if (!userContext.publicProfile) {
_context.next = 27;
break;
}
// publicProfile or preferencesFile
newBookmarkFile = $rdf.sym(userContext.publicProfile.dir().uri + fileTail);
_context.prev = 12;
debug.log('Creating new bookmark file ' + newBookmarkFile);
_context.next = 16;
return createIfNotExists(newBookmarkFile);
case 16:
_context.next = 22;
break;
case 18:
_context.prev = 18;
_context.t0 = _context["catch"](12);
alert.error("Can't make fresh bookmark file:" + _context.t0);
return _context.abrupt("return", userContext);
case 22:
_context.next = 24;
return UI.authn.registerInTypeIndex(userContext, newBookmarkFile, theClass, true);
case 24:
// public
userContext.bookmarkDocument = newBookmarkFile;
_context.next = 28;
break;
case 27:
alert('You seem to have no bookmark file and not even a profile file.');
case 28:
return _context.abrupt("return", userContext);
case 29:
case "end":
return _context.stop();
}
}
}, _callee, null, [[12, 18]]);
}));
return _findBookmarkDocument.apply(this, arguments);
}
function addBookmark(_x2, _x3) {
return _addBookmark.apply(this, arguments);
}
function _addBookmark() {
_addBookmark = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(context, target) {
var title, me, author, bookmarkDoc, bookmark, ins, msg;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
/* like
@prefix terms: <http://purl.org/dc/terms/>.
@prefix bookm: <http://www.w3.org/2002/01/bookmark#>.
@prefix n0: <http://xmlns.com/foaf/0.1/>.
<> terms:references <#0.5534145389246576>.
<#0.5534145389246576>
a bookm:Bookmark;
terms:created "2019-01-26T20:26:44.374Z"^^XML:dateTime;
terms:title "Herons";
bookm:recalls wiki:Heron;
n0:maker c:me.
*/
title = '';
me = UI.authn.currentUser(); // If already logged on
if (me) {
_context2.next = 4;
break;
}
throw new Error('Must be logged on to add Bookmark');
case 4:
author = kb.any(target, ns.foaf('maker'));
title = label(author) + ': ' + kb.anyValue(target, ns.sioc('content')).slice(0, 80); // @@ add chat title too?
bookmarkDoc = context.bookmarkDocument;
bookmark = UI.widgets.newThing(bookmarkDoc, title);
ins = [$rdf.st(bookmarkDoc, UI.ns.dct('references'), bookmark, bookmarkDoc), $rdf.st(bookmark, UI.ns.rdf('type'), BOOK('Bookmark'), bookmarkDoc), $rdf.st(bookmark, UI.ns.dct('created'), new Date(), bookmarkDoc), $rdf.st(bookmark, BOOK('recalls'), target, bookmarkDoc), $rdf.st(bookmark, UI.ns.foaf('maker'), me, bookmarkDoc), $rdf.st(bookmark, UI.ns.dct('title'), title, bookmarkDoc)];
_context2.prev = 9;
_context2.next = 12;
return updatePromise([], ins);
case 12:
_context2.next = 19;
break;
case 14:
_context2.prev = 14;
_context2.t0 = _context2["catch"](9);
msg = 'Making bookmark: ' + _context2.t0;
alert.error(msg);
return _context2.abrupt("return", null);
case 19:
return _context2.abrupt("return", bookmark);
case 20:
case "end":
return _context2.stop();
}
}
}, _callee2, null, [[9, 14]]);
}));
return _addBookmark.apply(this, arguments);
}
function toggleBookmark(_x4, _x5, _x6) {
return _toggleBookmark.apply(this, arguments);
}
function _toggleBookmark() {
_toggleBookmark = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(userContext, target, bookmarkButton) {
var bookmarks, i, bookmark;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 2;
return kb.fetcher.load(userContext.bookmarkDocument);
case 2:
bookmarks = kb.each(null, BOOK('recalls'), target, userContext.bookmarkDocument);
if (!bookmarks.length) {
_context3.next = 24;
break;
}
if (confirm('Delete bookmark on this?' + bookmarks.length)) {
_context3.next = 6;
break;
}
return _context3.abrupt("return");
case 6:
i = 0;
case 7:
if (!(i < bookmarks.length)) {
_context3.next = 22;
break;
}
_context3.prev = 8;
_context3.next = 11;
return updatePromise(kb.connectedStatements(bookmarks[i]), []);
case 11:
bookmarkButton.style.backgroundColor = 'white';
debug.log('Bookmark deleted: ' + bookmarks[i]);
_context3.next = 19;
break;
case 15:
_context3.prev = 15;
_context3.t0 = _context3["catch"](8);
debug.error('Cant delete bookmark:' + _context3.t0);
alert('Cant delete bookmark:' + _context3.t0);
case 19:
i++;
_context3.next = 7;
break;
case 22:
_context3.next = 29;
break;
case 24:
_context3.next = 26;
return addBookmark(userContext, target);
case 26:
bookmark = _context3.sent;
bookmarkButton.style.backgroundColor = 'yellow';
debug.log('Bookmark added: ' + bookmark);
case 29:
case "end":
return _context3.stop();
}
}
}, _callee3, null, [[8, 15]]);
}));
return _toggleBookmark.apply(this, arguments);
}
function renderBookmarksButton(_x7, _x8) {
return _renderBookmarksButton.apply(this, arguments);
}
function _renderBookmarksButton() {
_renderBookmarksButton = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(userContext, target) {
var setBookmarkButtonColor, _setBookmarkButtonColor, bookmarkButton;
return _regenerator["default"].wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
_setBookmarkButtonColor = function _setBookmarkButtonCol2() {
_setBookmarkButtonColor = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(bookmarkButton) {
var bookmarked;
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return kb.fetcher.load(userContext.bookmarkDocument);
case 2:
bookmarked = kb.any(null, BOOK('recalls'), bookmarkButton.target, userContext.bookmarkDocument);
bookmarkButton.style = UI.style.buttonStyle;
if (bookmarked) bookmarkButton.style.backgroundColor = 'yellow';
case 5:
case "end":
return _context4.stop();
}
}
}, _callee4);
}));
return _setBookmarkButtonColor.apply(this, arguments);
};
setBookmarkButtonColor = function _setBookmarkButtonCol(_x9) {
return _setBookmarkButtonColor.apply(this, arguments);
};
if (!userContext.bookmarkDocument) {
_context5.next = 8;
break;
}
bookmarkButton = UI.widgets.button(dom, UI.icons.iconBase + BOOKMARK_ICON, label(BOOK('Bookmark')), function () {
toggleBookmark(userContext, target, bookmarkButton);
});
bookmarkButton.target = target;
_context5.next = 7;
return setBookmarkButtonColor(bookmarkButton);
case 7:
return _context5.abrupt("return", bookmarkButton);
case 8:
case "end":
return _context5.stop();
}
}
}, _callee5);
}));
return _renderBookmarksButton.apply(this, arguments);
}
//# sourceMappingURL=bookmarks.js.map