mirror of
https://github.com/keven1024/015.git
synced 2026-05-26 07:08:02 +00:00
46 lines
1.2 KiB
Vue
46 lines
1.2 KiB
Vue
<script setup lang="ts">
|
|
import { Drawer, DrawerContent } from '@/components/ui/drawer'
|
|
import type { VNode } from 'vue'
|
|
import useStore from '@/composables/useStore'
|
|
import { isFunction } from 'lodash-es'
|
|
|
|
type DrawerOnclose<T = unknown> = (data?: T) => Promise<void>
|
|
type DrawerRender<T = unknown> = VNode | ((props: { hide: DrawerOnclose<T> }) => VNode)
|
|
export type DrawerItem<T = unknown> = {
|
|
render?: DrawerRender<T>
|
|
onClose: DrawerOnclose<T>
|
|
key: string
|
|
visible: boolean
|
|
}
|
|
|
|
const store = useStore()
|
|
|
|
const Children = ({ drawer }: { drawer: DrawerItem }) => {
|
|
if (!drawer.render) {
|
|
return null
|
|
}
|
|
return isFunction(drawer.render) ? drawer.render({ hide: drawer.onClose }) : drawer.render
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<Drawer
|
|
v-for="item in store.drawer"
|
|
:key="item.key"
|
|
:open="item.visible"
|
|
@update:open="
|
|
(open) => {
|
|
if (!open) {
|
|
item.onClose()
|
|
}
|
|
}
|
|
"
|
|
>
|
|
<DrawerContent>
|
|
<div class="mx-auto min-w-lg max-w-[80vw] pb-10 px-3">
|
|
<Children :drawer="item" />
|
|
</div>
|
|
</DrawerContent>
|
|
</Drawer>
|
|
</template>
|