import { computed, getCurrentInstance, ref, watch } from 'vue' import { UPDATE_MODEL_EVENT } from '../../../../constants' import type { PopupProps } from '../popup' export const usePopup = (props: PopupProps) => { const { emit } = getCurrentInstance()! const iosDevice = computed(() => { const systemInfo = uni.getSystemInfoSync() return systemInfo.osName === 'ios' || systemInfo.osName === 'macos' }) // 是否显示遮罩层 const showOverlay = ref(false) // 是否显示弹框 const showPopup = ref(false) const visiblePopup = ref(false) let initPopupModelValue = false watch( () => props.modelValue, (value) => { if (value) { visiblePopup.value = true if (iosDevice.value) { setTimeout(() => { showPopup.value = true if (props.overlay) showOverlay.value = true initPopupModelValue && emit('open') }, 0) } else { showPopup.value = true if (props.overlay) showOverlay.value = true initPopupModelValue && emit('open') } } else { showPopup.value = false showOverlay.value = false setTimeout(() => { visiblePopup.value = false }, 250) initPopupModelValue && emit('close') } initPopupModelValue = true }, { immediate: true, } ) // 更新模态框的状态 const updateModelValue = (value: boolean) => { emit(UPDATE_MODEL_EVENT, value) } // 点击关闭按钮 const onClickCloseBtn = () => { updateModelValue(false) emit('close') } // 点击遮罩层关闭模态框 const onClickOverlay = () => { if (props.overlayCloseable) { updateModelValue(false) emit('close') emit('overlay-click') } } return { iosDevice, showOverlay, showPopup, visiblePopup, updateModelValue, onClickCloseBtn, onClickOverlay, } }