import { defineStore } from 'pinia' import { computed, defineComponent, onUnmounted, reactive } from 'vue' import type { Block } from './layout.types' import clsx from 'clsx' import useLayoutStore from './useLayoutStore' const defaultDisplay = { x: 0, y: 0, type: 'global' as Block | 'global' | 'dock' } export const useMenuStore = defineStore('menu', () => { const display = reactive(defaultDisplay) const mPos = { x: 0, y: 0 } const handle = (e: MouseEvent) => { mPos.x = e.pageX mPos.y = e.pageY } window.addEventListener('mousemove', handle) onUnmounted(() => { window.removeEventListener('mousemove', handle) }) const open = (type: (typeof defaultDisplay)['type']) => { display.x = Math.min(window.innerWidth - 140, mPos.x) display.y = Math.min(window.innerHeight - 240, mPos.y) display.type = type } const show = computed(() => display.x > 0 && display.y > 0) const dismiss = () => { display.x = 0 display.y = 0 display.type = 'global' } return { display, open, dismiss, show } }) const Item = defineComponent({ props: { alert: { type: Boolean, default: false } }, emits: { click: () => true }, setup(props, ctx) { return () => (
{ ctx.emit('click') }} > {ctx.slots.default?.()}
) } }) export default defineComponent(() => { const menu = useMenuStore() const layout = useLayoutStore() return () => menu.show && (
{ console.log(2333) menu.dismiss() }} class="fixed px-2 pt-4 pb-2 bg-white/60 backdrop-blur shadow-lg rounded-lg overflow-hidden w-[120px]" style={{ zIndex: '999', left: menu.display.x + 'px', top: menu.display.y + 'px' }} > {(() => { if (menu.display.type === 'global') { // 全局菜单 return <> } if (menu.display.type === 'dock') { // dock 栏 return <> } const block = menu.display.type if (!block.link) { // 小组件 return ( <> { // 删除链接 const idx = layout.currentPage.list.findIndex((el) => el.id === block.id) if (idx < 0) return layout.currentPage.list.splice(idx, 1) menu.dismiss() }} > 删除 ) } if (block.link.startsWith('id:')) { // 文件夹 const id = block.link.slice(3) return ( <> { block.w = 1 block.h = 1 menu.dismiss() }} > 小 { block.w = 2 block.h = 2 menu.dismiss() }} > 大 { // 删除文件夹 const idx = layout.currentPage.list.findIndex((el) => el.id === block.id) if (idx < 0) return layout.currentPage.list.splice(idx, 1) delete layout.state.dir[id] menu.dismiss() }} > 删除 ) } // 链接 return ( <> 测试 { // 删除链接 let idx = layout.currentPage.list.findIndex((el) => el.id === block.id) if (idx < 0) { // 查找文件夹 idx = layout.state.dir[layout.openDir]?.list?.findIndex( (el) => el.id === block.id ) if (idx === undefined || idx < 0) { // 查找 dock idx = layout.state.dock.findIndex((el) => el?.id === block.id) if (idx >= 0) { layout.state.dock[idx] = null menu.dismiss() } } else { const list = layout.state.dir[layout.openDir].list list.splice(idx, 1) layout.checkDir(layout.openDir) menu.dismiss() } } else { layout.currentPage.list.splice(idx, 1) menu.dismiss() } }} > 删除 ) })()}
) })