Files
MoviePilot-Frontend/src/composables/useDynamicButton.ts

125 lines
3.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { ref, inject, nextTick, onMounted, onActivated, onDeactivated, onUnmounted } from 'vue'
// 声明全局变量类型
declare global {
interface Window {
__VUE_INJECT_DYNAMIC_BUTTON__?: (button: any) => void
}
}
/**
* 动态按钮钩子函数
*
* @param options 配置选项
* @returns 控制函数和状态
*
* @example
* // 在页面中使用
* const { openDialog } = useDynamicButton({
* icon: 'mdi-cog',
* onClick: () => {
* dialog.value = true
* }
* })
*/
export function useDynamicButton(options: {
icon: string
onClick: () => void
autoRegister?: boolean // 是否自动注册默认为true
}) {
// 提取配置
const { icon, onClick, autoRegister = true } = options
// 动态按钮相关
const registerDynamicButton = inject<((button: any) => void) | null>('registerDynamicButton', null)
const unregisterDynamicButton = inject<(() => void) | null>('unregisterDynamicButton', null)
// 按钮注册状态
const dynamicButtonRegistered = ref(false)
// 注册动态按钮
function setupDynamicButton() {
// 避免重复注册
if (dynamicButtonRegistered.value) return
// 确保注册方法存在
if (!registerDynamicButton) {
// 尝试获取全局注册方法
const tryUseGlobalMethod = () => {
if (typeof window !== 'undefined' && window.__VUE_INJECT_DYNAMIC_BUTTON__) {
window.__VUE_INJECT_DYNAMIC_BUTTON__({
icon,
action: onClick,
show: true,
})
dynamicButtonRegistered.value = true
return true
}
return false
}
// 立即尝试一次
if (!tryUseGlobalMethod()) {
// 如果失败,延迟再试一次
setTimeout(tryUseGlobalMethod, 1000)
}
return
}
// 如果注册方法存在,直接注册
nextTick(() => {
registerDynamicButton({
icon,
action: onClick,
show: true,
})
dynamicButtonRegistered.value = true
})
}
// 取消注册动态按钮
function cleanupDynamicButton() {
if (unregisterDynamicButton && dynamicButtonRegistered.value) {
unregisterDynamicButton()
dynamicButtonRegistered.value = false
}
}
// 暴露方法:手动打开对话框
function openDialog() {
onClick()
}
// 生命周期钩子
if (autoRegister) {
onMounted(() => {
// 延迟执行确保Footer组件已加载
setTimeout(() => {
setupDynamicButton()
}, 500)
})
onActivated(() => {
// 重置注册状态,确保每次激活时都重新注册
dynamicButtonRegistered.value = false
setupDynamicButton()
})
onDeactivated(() => {
cleanupDynamicButton()
})
onUnmounted(() => {
cleanupDynamicButton()
})
}
// 返回控制函数和状态
return {
setupDynamicButton, // 手动注册按钮
cleanupDynamicButton, // 手动取消注册
openDialog, // 手动触发点击事件
isRegistered: dynamicButtonRegistered, // 注册状态
}
}