fix: improve drawer management by adding onClose handler and refactoring GlobalDrawer component

This commit is contained in:
keven1024
2025-07-07 14:55:26 +08:00
parent 464dba2546
commit 338e22dfca
3 changed files with 19 additions and 9 deletions

View File

@@ -8,9 +8,10 @@ const drawer = computed(() => store?._get('drawer'))
const currentDrawer = computed(() => drawer?.value?.[drawer?.value?.length - 1])
const render = computed(() => currentDrawer?.value?.render)
const hide = computed(() => currentDrawer?.value?.onClose)
const Children = () =>
createVNode(render.value, {
hide: () => store?._set('drawer', drawer?.value?.slice(0, -1)),
hide,
})
</script>
@@ -20,7 +21,7 @@ const Children = () =>
@update:open="
(open) => {
if (!open && drawer?.length > 0) {
store?._set('drawer', drawer?.slice(0, -1))
hide()
}
}
"

View File

@@ -1,5 +1,5 @@
import { toast } from 'vue-sonner'
declare const window: any
let shareIdTokenMap: WeakMap<{ share_id: string }, string>
const getShareToken = async (share_id: string): Promise<string | undefined> => {
@@ -34,9 +34,8 @@ const downloadFile = async (share_id: string) => {
const token = await getShareToken(share_id)
if (!token) {
throw new Error('获取token失败')
return
}
;(window as any)?.open(`/api/download?token=${token}`)
window?.open(`/api/download?token=${token}`)
} catch (e) {
toast.error((e as any)?.data?.message || e)
}

View File

@@ -1,11 +1,21 @@
interface DrawerProps {
render: (props: { hide: () => void }) => Component
render: (props: { hide: () => void }) => Component
}
const showDrawer = (props: DrawerProps) => {
const { render } = props || {}
const store = useStore()
store?._set('drawer', [...(store?._get('drawer')?.value || []), { render }])
const key = Math.random().toString(36).slice(2, 8)
return new Promise<void>((res) => {
const { render } = props || {}
const onClose = () => {
store._set(
'drawer',
(store._get('drawer')?.value ?? [])?.filter((item: any) => item.key !== key)
)
res()
}
const store = useStore()
store._set('drawer', [...(store._get('drawer')?.value || []), { render, onClose, key }])
})
}
export default showDrawer