tav-ui
Version:
131 lines (128 loc) • 3.77 kB
JavaScript
import { reactive, ref, getCurrentInstance, onUnmounted, unref, computed, toRaw, watchEffect, nextTick } from 'vue';
import { tryOnUnmounted } from '@vueuse/core';
import { isEqual } from 'lodash-es';
import { isFunction } from '../../../../utils/is2.mjs';
import { error } from '../../../../utils/log2.mjs';
const dataTransfer = reactive({});
const isProdMode = () => true;
const visibleData = reactive({});
function useModal() {
const modal = ref(null);
const loaded = ref(false);
const uid = ref("");
function register(modalMethod, uuid) {
if (!getCurrentInstance())
throw new Error("useModal() can only be used inside setup() or functional components!");
uid.value = uuid;
isProdMode() && onUnmounted(() => {
modal.value = null;
loaded.value = false;
dataTransfer[unref(uid)] = null;
});
if (unref(loaded) && isProdMode() && modalMethod === unref(modal))
return;
modal.value = modalMethod;
loaded.value = true;
modalMethod.emitVisible = (visible, uid2) => {
visibleData[uid2] = visible;
};
}
const getInstance = () => {
const instance = unref(modal);
if (!instance)
error("useModal instance is undefined!");
return instance;
};
const methods = {
setModalProps: (props) => {
getInstance()?.setModalProps(props);
},
getVisible: computed(() => {
return visibleData[~~unref(uid)];
}),
redoModalHeight: () => {
getInstance()?.redoModalHeight?.();
},
redoThumbHeight: () => {
getInstance()?.redoThumbHeight?.();
},
openModal: (visible = true, data, openOnSet = true) => {
getInstance()?.setModalProps({
visible
});
if (!data)
return;
const id = unref(uid);
if (openOnSet) {
dataTransfer[id] = null;
dataTransfer[id] = toRaw(data);
return;
}
const equal = isEqual(toRaw(dataTransfer[id]), toRaw(data));
if (!equal)
dataTransfer[id] = toRaw(data);
},
closeModal: () => {
getInstance()?.setModalProps({ visible: false });
}
};
return [register, methods];
}
const useModalInner = (callbackFn) => {
const modalInstanceRef = ref(null);
const currentInstance = getCurrentInstance();
const uidRef = ref("");
const getInstance = () => {
const instance = unref(modalInstanceRef);
if (!instance)
error("useModalInner instance is undefined!");
return instance;
};
const register = (modalInstance, uuid) => {
isProdMode() && tryOnUnmounted(() => {
modalInstanceRef.value = null;
});
uidRef.value = uuid;
modalInstanceRef.value = modalInstance;
currentInstance?.emit("register", modalInstance, uuid);
};
watchEffect(() => {
const data = dataTransfer[unref(uidRef)];
if (!data)
return;
if (!callbackFn || !isFunction(callbackFn))
return;
nextTick(() => {
callbackFn(data);
});
});
return [
register,
{
changeLoading: (loading = true) => {
getInstance()?.setModalProps({ loading });
},
getVisible: computed(() => {
return visibleData[~~unref(uidRef)];
}),
changeOkLoading: (loading = true) => {
getInstance()?.setModalProps({ confirmLoading: loading });
},
closeModal: () => {
getInstance()?.setModalProps({ visible: false });
},
setModalProps: (props) => {
getInstance()?.setModalProps(props);
},
redoModalHeight: () => {
const callRedo = getInstance()?.redoModalHeight;
callRedo && callRedo();
},
redoThumbHeight() {
getInstance()?.redoThumbHeight?.();
}
}
];
};
export { useModal, useModalInner };
//# sourceMappingURL=useModal2.mjs.map