local-clipboard
Version:
On-site Clipboard using local storage API
146 lines (145 loc) • 4.67 kB
JavaScript
;
var ls = require('local-storage');
var CLIPBOARD_KEY = 'LOCAL_CLIPBOARD';
var localListeners = [];
function addLocalListener(listener) {
if (typeof listener === 'function') {
localListeners.push(listener);
}
}
exports.addLocalListener = addLocalListener;
function removeLocalListener(listener) {
if (typeof listener === 'function') {
var index = localListeners.indexOf(listener);
if (index !== -1) {
localListeners.splice(index, 1);
}
}
}
exports.removeLocalListener = removeLocalListener;
function copy(data, options) {
var payload = { content: data };
if (options) {
if (options.description) {
payload.description = options.description;
}
if (options.type) {
payload.type = options.type;
}
if (options.metadata) {
payload.metadata = options.metadata;
}
}
if (localListeners.length > 0) {
var old_1 = ls.get(CLIPBOARD_KEY);
var url_1 = (window && window.location && window.location.href) || null;
ls.set(CLIPBOARD_KEY, payload);
localListeners.forEach(function (l) { return l(payload, old_1, url_1); });
}
else {
ls.set(CLIPBOARD_KEY, payload);
}
}
exports.copy = copy;
function hasData() {
var data = ls.get(CLIPBOARD_KEY);
return data && 'content' in data;
}
exports.hasData = hasData;
function getType() {
var data = ls.get(CLIPBOARD_KEY);
if (data && data.type) {
return data.type;
}
}
exports.getType = getType;
function getDescription() {
var data = ls.get(CLIPBOARD_KEY);
if (data && data.description) {
return data.description;
}
}
exports.getDescription = getDescription;
function getMetadata() {
var data = ls.get(CLIPBOARD_KEY);
if (data && data.metadata) {
return data.metadata;
}
}
exports.getMetadata = getMetadata;
function paste() {
var data = ls.get(CLIPBOARD_KEY);
if (data && data.content) {
return data.content;
}
}
exports.paste = paste;
function clear() {
ls.remove(CLIPBOARD_KEY);
}
exports.clear = clear;
function listen(listener) {
ls.on(CLIPBOARD_KEY, listener);
}
exports.listen = listen;
function unlisten(listener) {
ls.off(CLIPBOARD_KEY, listener);
}
exports.unlisten = unlisten;
function onCopy(method, listenOnLocalChanges) {
if (listenOnLocalChanges === void 0) { listenOnLocalChanges = false; }
return {
componentDidMountHook: function (props, context, state, child) {
if (!child) {
throw new Error('onCopy must be used on a class component.');
}
function copyListener(v, o, u) {
child[method](v, o, u);
}
state.listener = copyListener;
listen(copyListener);
if (listenOnLocalChanges) {
function localCopyListener(v, o, u) {
child[method](v, o, u);
}
state.localListener = localCopyListener;
addLocalListener(localCopyListener);
}
},
componentWillUnmountHook: function (props, context, state) {
unlisten(state.listener);
if (listenOnLocalChanges) {
removeLocalListener(state.localListener);
}
},
};
}
exports.onCopy = onCopy;
function forwardClipboard(prop, listenOnLocalChanges) {
if (listenOnLocalChanges === void 0) { listenOnLocalChanges = false; }
return {
initialStateInjector: function (p, c, state, forceUpdater) { return state.update = forceUpdater; },
propInjector: function (setProp) { return setProp(prop, ls.get(CLIPBOARD_KEY)); },
componentDidMountHook: function (props, context, state) {
function copyListener() {
state.update();
}
state.listener = copyListener;
listen(copyListener);
if (listenOnLocalChanges) {
function localCopyListener() {
state.update();
}
state.localListener = localCopyListener;
addLocalListener(localCopyListener);
}
},
componentWillUnmountHook: function (props, context, state) {
unlisten(state.listener);
if (listenOnLocalChanges) {
removeLocalListener(state.localListener);
}
},
};
}
exports.forwardClipboard = forwardClipboard;