automated_uniapp/uni_modules/cool-ui/components/cl-confirm/cl-confirm.vue
2025-01-09 16:16:11 +08:00

174 lines
3.4 KiB
Vue

<template>
<view class="cl-confirm">
<cl-dialog
v-model="visible"
:title="conf.title"
:width="conf.width"
:close-on-click-modal="conf.closeOnClickModal"
@close="onClose"
@closed="onClosed"
>
<template #header>
<view class="cl-confirm__header">
<text class="cl-icon-toast-error" v-if="conf.type == 'error'"></text>
<text class="cl-icon-toast-warning" v-else-if="conf.type == 'warning'"></text>
<text class="cl-icon-toast-success" v-else-if="conf.type == 'success'"></text>
<text class="cl-confirm__title">{{ conf.title }}</text>
</view>
</template>
<view
class="cl-confirm__container"
:style="{
textAlign: conf.message ? 'center' : 'left',
}"
>
<slot>
<view class="cl-confirm__message">{{ conf.message }}</view>
</slot>
</view>
<template #footer v-if="conf.showCancelButton || conf.showConfirmButton">
<view class="cl-confirm__footer">
<view class="cl-confirm__footer-item" v-if="conf.showCancelButton">
<cl-button fill @tap="close('cancel')">
{{ conf.cancelButtonText }}</cl-button
>
</view>
<view class="cl-confirm__footer-item" v-if="conf.showConfirmButton">
<cl-button fill type="primary" :loading="loading" @tap="close('confirm')">
{{ conf.confirmButtonText }}
</cl-button>
</view>
</view>
</template>
</cl-dialog>
</view>
</template>
<script lang="ts">
import { defineComponent, nextTick, ref } from "vue";
export default defineComponent({
name: "cl-confirm",
setup() {
// 是否可见
const visible = ref(false);
// 是否已关闭
const closed = ref(true);
// 是否加载中
const loading = ref(false);
// 配置
const conf = ref<ClConfirm.Options>({});
// 计时器
let timer: any;
// 锁
let lock = false;
// 打开
function open(options: ClConfirm.Options) {
lock = false;
visible.value = false;
clearTimeout(timer);
function next() {
visible.value = true;
closed.value = false;
// 设置选项
nextTick(() => {
conf.value = {
width: "500rpx",
showCancelButton: true,
showConfirmButton: true,
confirmButtonText: "确认",
cancelButtonText: "取消",
closeOnClickModal: true,
...options,
};
// 是否定时关闭
if (conf.value.duration) {
timer = setTimeout(() => {
close("close");
}, conf.value.duration);
}
});
}
if (!closed.value) {
setTimeout(() => {
next();
}, 350);
} else {
next();
}
}
// 关闭
function close(action: ClConfirm.Action = "close") {
lock = true;
// 完成
function done() {
if (conf.value.callback) {
conf.value.callback(action);
}
nextTick(() => {
visible.value = false;
hideLoading();
});
}
// 加载中
function showLoading() {
loading.value = true;
}
// 关闭加载
function hideLoading() {
loading.value = false;
}
if (conf.value.beforeClose) {
conf.value.beforeClose(action, { done, showLoading, hideLoading });
} else {
done();
}
}
// 监听关闭
function onClose() {
clearTimeout(timer);
if (!lock) {
close("close");
}
}
// 监听关闭后
function onClosed() {
closed.value = true;
}
return {
visible,
loading,
conf,
open,
close,
onClose,
onClosed,
};
},
});
</script>