ant-design-vue
Version:
An enterprise-class UI design language and Vue-based implementation
64 lines • 1.88 kB
JavaScript
import { computed, inject, provide } from 'vue';
var TriggerContextKey = Symbol('TriggerContextKey');
export var useProviderTrigger = function useProviderTrigger() {
var portal = null;
provide(TriggerContextKey, {
setPortal: function setPortal(val) {
portal = val;
},
popPortal: true
});
return function () {
return portal;
};
};
export var useInjectTrigger = function useInjectTrigger(tryPopPortal) {
return tryPopPortal ? inject(TriggerContextKey, {
setPortal: function setPortal() {},
popPortal: false
}) : {
setPortal: function setPortal() {},
popPortal: false
};
};
var PortalContextKey = Symbol('PortalContextKey');
export var useProvidePortal = function useProvidePortal(instance) {
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
inTriggerContext: true
};
provide(PortalContextKey, {
inTriggerContext: config.inTriggerContext,
shouldRender: computed(function () {
var _ref = instance || {},
sPopupVisible = _ref.sPopupVisible,
popupRef = _ref.popupRef,
forceRender = _ref.forceRender,
autoDestroy = _ref.autoDestroy;
// if (popPortal) return true;
var shouldRender = false;
if (sPopupVisible || popupRef || forceRender) {
shouldRender = true;
}
if (!sPopupVisible && autoDestroy) {
shouldRender = false;
}
return shouldRender;
})
});
};
export var useInjectPortal = function useInjectPortal() {
useProvidePortal({}, {
inTriggerContext: false
});
var portalContext = inject(PortalContextKey, {
shouldRender: computed(function () {
return false;
}),
inTriggerContext: false
});
return {
shouldRender: computed(function () {
return portalContext.shouldRender.value || portalContext.inTriggerContext === false;
})
};
};