CardService

# CardService

CardService 是 AutumnBox 宿主中 Card(首页卡片)的注册表。所有通过 defineCard()context.registerCard() 注册的卡片都由它统一管理。插件可以通过它查询已注册的 Card 列表、判断某张 Card 属于哪个插件,以及在运行时动态注册和注销 Card。

# 获取方式

import { useService, useServiceState } from '@autumnbox/sdk/hooks';
import { CardService } from '@autumnbox/sdk/hooks';

// React 组件中
const cardService = useService(CardService);

// pluginMain 或非 React 环境中
const cardService = context.getService(CardService);

# API 一览

方法 / 属性 签名 说明
cards readonly cards: IReadonlyState<readonly AutumnCard[]> 响应式的已注册 Card 列表
register register({ card, pluginPackageName }): void 注册一张 Card
unregister unregister(cardId: string): void 按 ID 注销一张 Card
unregisterByPluginPackageName unregisterByPluginPackageName(pluginPackageName: string): void 注销某个插件的所有 Card
getCard getCard(id: string): AutumnCard \| undefined 按 ID 查找 Card
getPluginPackageName getPluginPackageName(cardId: string): string \| undefined 查询 Card 所属插件

# 订阅 Card 列表

cards 是一个响应式的 IReadonlyState,当有新 Card 注册或注销时自动通知订阅者。配合 useServiceState 使用时,列表变化会自动触发 React 重渲染:

import { useService, useServiceState } from '@autumnbox/sdk/hooks';
import { CardService } from '@autumnbox/sdk/hooks';

const CardCounter: React.FC = () => {
  const cardService = useService(CardService);
  const [cards] = useServiceState(cardService.cards);

  return <span>当前已注册 {cards.length} 张卡片</span>;
};

# 查询 Card

# 按 ID 查找

const cardService = useService(CardService);

const batteryCard = cardService.getCard('battery');
if (batteryCard) {
  console.log('找到卡片:', batteryCard.id);
}

# 查看 Card 归属

const pluginName = cardService.getPluginPackageName('battery');
// → 'autumnbox.main-plugin'

# 列出某插件的所有 Card

CardService 没有直接的按插件过滤方法,但可以结合 cards 列表和 getPluginPackageName 实现:

const cardService = useService(CardService);
const [cards] = useServiceState(cardService.cards);

const mainPluginCards = cards.filter(
  (card) => cardService.getPluginPackageName(card.id) === 'autumnbox.main-plugin',
);
console.log('main-plugin 注册了', mainPluginCards.length, '张 Card');

# 动态注册与注销

大多数情况下,Card 通过 defineCard() + __entry__.ts 自动注册。但如果需要在运行时动态控制 Card 的显示,可以手动调用注册和注销方法。

# 在 pluginMain 中注册

import type { PluginContext, AutumnCard } from '@autumnbox/sdk';
import { CardService } from '@autumnbox/sdk/hooks';
import { MyStatusCard } from './cards/MyStatusCard';

export function pluginMain(context: PluginContext): () => void {
  const cardService = context.getService(CardService);

  const card: AutumnCard = {
    id: 'my-status',
    name: 'card.name.my_status',
    component: MyStatusCard,
  };

  cardService.register({
    card,
    pluginPackageName: context.pluginPackageName,
  });

  // 插件卸载时注销
  return () => {
    cardService.unregister('my-status');
  };
}

# 批量注销

当插件被卸载时,宿主会自动调用 unregisterByPluginPackageName 清理该插件注册的所有 Card。插件自身通常不需要调用此方法,但它在构建插件管理工具时很有用:

// 移除某个插件的所有 Card
cardService.unregisterByPluginPackageName('autumnbox.old-plugin');

# 下一步