feat(plugin): expose native subscribe action (#502)

This commit is contained in:
jxxghp
2026-07-23 17:29:36 +08:00
parent 787076355b
commit 31caf8f5f8
10 changed files with 540 additions and 11 deletions
@@ -8,6 +8,7 @@ import FormRender from '../render/FormRender.vue'
import ProgressDialog from '../dialog/ProgressDialog.vue'
import { useI18n } from 'vue-i18n'
import { loadRemoteComponent } from '@/utils/federationLoader'
import { usePluginNativeSubscribe } from '@/composables/usePluginNativeSubscribe'
// 国际化
const { t } = useI18n()
@@ -43,6 +44,10 @@ const $toast = useToast()
// 向联邦插件提供主应用 Toast,避免远程组件自行创建通知容器。
provide('moviepilot:toast', $toast)
// 配置联邦组件沿用与其它插件宿主一致的原生订阅能力。
const nativeSubscribe = usePluginNativeSubscribe()
provide('moviepilot:nativeSubscribe', nativeSubscribe)
// 是否刷新
const isRefreshed = ref(false)
@@ -209,6 +214,7 @@ onBeforeMount(async () => {
:is="dynamicComponent"
:initial-config="pluginConfigForm"
:api="api"
:native-subscribe="nativeSubscribe"
@save="handleVueComponentSave"
@layout="handleVueComponentLayout"
@switch="emit('switch')"
@@ -6,6 +6,7 @@ import api from '@/api'
import { loadRemoteComponent } from '@/utils/federationLoader'
import { usePWA } from '@/composables/usePWA'
import { useToast } from 'vue-toastification'
import { usePluginNativeSubscribe } from '@/composables/usePluginNativeSubscribe'
// 输入参数
const props = defineProps({
@@ -31,6 +32,10 @@ const { appMode } = usePWA()
const $toast = useToast()
provide('moviepilot:toast', $toast)
// 向联邦插件同时提供 prop 与 inject 形式的主程序原生订阅入口。
const nativeSubscribe = usePluginNativeSubscribe()
provide('moviepilot:nativeSubscribe', nativeSubscribe)
// 是否刷新
const isRefreshed = ref(false)
// 组件是否已加载成功
@@ -158,6 +163,7 @@ onMounted(() => {
<component
:is="dynamicComponent"
:api="api"
:native-subscribe="nativeSubscribe"
:show_switch="show_switch"
@action="handleAction"
@switch="emit('switch')"
+13 -1
View File
@@ -6,6 +6,7 @@ import DashboardRender from '@/components/render/DashboardRender.vue'
import { isNullOrEmptyObject } from '@/@core/utils'
import { loadRemoteComponent } from '@/utils/federationLoader'
import { useToast } from 'vue-toastification'
import { usePluginNativeSubscribe } from '@/composables/usePluginNativeSubscribe'
type DashboardComponentLoader = () => Promise<any>
@@ -13,7 +14,12 @@ type DashboardComponentLoader = () => Promise<any>
const $toast = useToast()
provide('moviepilot:toast', $toast)
// 向仪表板联邦组件导出主程序原生订阅入口。
const nativeSubscribe = usePluginNativeSubscribe()
provide('moviepilot:nativeSubscribe', nativeSubscribe)
const DashboardSkeleton = {
// 创建无需模板编译的仪表板加载骨架。
setup() {
const SkeletonLoader = resolveComponent('VSkeletonLoader')
@@ -226,7 +232,13 @@ onUnmounted(() => {
<template v-else-if="!isNullOrEmptyObject(props.config)">
<!-- Vue 渲染模式 -->
<div v-if="pluginRenderMode === 'vue'" class="dashboard-plugin-vue-renderer">
<component :is="dynamicPluginComponent" :config="props.config" :allow-refresh="props.allowRefresh" :api="api" />
<component
:is="dynamicPluginComponent"
:config="props.config"
:allow-refresh="props.allowRefresh"
:api="api"
:native-subscribe="nativeSubscribe"
/>
</div>
<!-- Vuetify 渲染模式 -->
<template v-else-if="pluginRenderMode === 'vuetify'">