@nativescript-community/ui-popover
Version:
Popover plugn
73 lines • 2.48 kB
JavaScript
import { createNativeView } from 'nativescript-vue';
import { showPopover } from '..';
const modalStack = [];
function _showPopover(component, options) {
const listeners = Object.entries(options?.on ?? {}).reduce((listeners, [key, value]) => {
listeners['on' + key.charAt(0).toUpperCase() + key.slice(1)] = value;
return listeners;
}, {});
const propsAndListeners = Object.assign(options?.props ?? {}, listeners);
let navEntryInstance = createNativeView(component, propsAndListeners);
navEntryInstance.mount();
const p = new Promise(async (resolve, reject) => {
let resolved = false;
const closeCallback = (result) => {
if (resolved) {
return;
}
resolved = true;
modalStack.pop();
options.onDismiss?.();
resolve(result);
navEntryInstance.unmount();
navEntryInstance = null;
};
let opt = {
anchor: options.anchor,
vertPos: options.vertPos,
horizPos: options.horizPos,
x: options.x,
y: options.y,
fitInScreen: options.fitInScreen,
outsideTouchable: options.outsideTouchable,
transparent: options.transparent,
backgroundColor: options.backgroundColor,
canOverlapSourceViewRect: options.canOverlapSourceViewRect,
context: options.context,
hideArrow: options.hideArrow,
onDismiss: closeCallback
};
try {
modalStack.push(showPopover(navEntryInstance.nativeView, opt));
}
catch (err) {
console.error(err);
reject(err);
}
});
return p;
}
async function _closePopover(result) {
const modalPageInstanceInfo = modalStack[modalStack.length - 1];
if (modalPageInstanceInfo) {
return modalPageInstanceInfo.close(result);
}
}
;
const PopoverPlugin = {
install(app) {
const globals = app.config.globalProperties;
globals.$showPopover = _showPopover;
globals.$closePopover = _closePopover;
}
};
const usePopover = () => {
const showPopover = async (component, options) => await _showPopover(component, options);
const closePopover = async (result) => await _closePopover(result);
return {
showPopover,
closePopover
};
};
export { PopoverPlugin, usePopover };
//# sourceMappingURL=index.js.map