UNPKG

@nativescript-community/ui-popover

Version:
73 lines 2.48 kB
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