57ea4d9858
- **docs**: 完善组件注释、README 目录结构及 AGENTS.md 文档。 - **refactor**: - 提取通用 `PageHeader`、`Button`、`DashboardCard` 及 `ErrorBoundary` 组件。 - 重构消息通信机制,采用 `@webext-core/messaging` 实现类型安全。 - 将全局通知系统重构为 `SnackbarProvider` (后合并至 `GlobalSnackbar`)。 - 迁移样式系统至 MUI 主题,移除冗余 CSS。 - 优化路由配置,支持独立标签页模式及页面懒加载。 - 移除未使用文件、URL 工具及表单映射相关功能。 - **feat**: - 新增配置导出功能(JSON)及状态提示。 - 新增侧边栏状态变化通知机制。 - 新增文本统计及 JWT 解析工具。 - 优化二维码生成与解析逻辑,换用更轻量的 `qrious` 和 `qr-scanner`。 - 增强高亮器功能,支持闪烁效果及 Shadow DOM 穿透。 - **style**: 优化仪表盘响应式网格布局及 UI 细节。 - **fix**: 修复 `useStorageState` 依赖缺失及路由初始化性能问题。 - **test**: 更新单元测试以覆盖新增的工具函数及功能特性。
61 lines
2.1 KiB
TypeScript
61 lines
2.1 KiB
TypeScript
import { defineExtensionMessaging } from '@webext-core/messaging';
|
|
|
|
export enum MessageAction {
|
|
RELOAD_TAB = 'reloadTab',
|
|
SIDE_PANEL_STATE_CHANGED = 'sidePanelStateChanged',
|
|
}
|
|
|
|
export interface MessageResponse {
|
|
success: boolean;
|
|
message?: string;
|
|
error?: string;
|
|
}
|
|
|
|
export interface ProtocolMap {
|
|
[MessageAction.RELOAD_TAB](data: { tabId: number; delay?: number }): MessageResponse;
|
|
[MessageAction.SIDE_PANEL_STATE_CHANGED](data: { isOpen: boolean }): void;
|
|
}
|
|
|
|
export const { sendMessage, onMessage } = defineExtensionMessaging<ProtocolMap>();
|
|
|
|
export async function sendMessageToContent<K extends keyof ProtocolMap>(
|
|
action: K,
|
|
...args: Parameters<ProtocolMap[K]>[0] extends undefined
|
|
? []
|
|
: [data: Parameters<ProtocolMap[K]>[0]]
|
|
): Promise<ReturnType<ProtocolMap[K]>> {
|
|
try {
|
|
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
|
|
if (!tab?.id) {
|
|
console.warn(`[Messaging] 无法获取当前标签页,无法发送动作: ${action}`);
|
|
return { success: false, message: '无法获取当前标签页' } as ReturnType<ProtocolMap[K]>;
|
|
}
|
|
|
|
const data = args.length > 0 ? args[0] : undefined;
|
|
|
|
const response = await (
|
|
sendMessage as (
|
|
type: K,
|
|
data: Parameters<ProtocolMap[K]>[0],
|
|
arg?: number,
|
|
) => Promise<ReturnType<ProtocolMap[K]>>
|
|
)(action, data as Parameters<ProtocolMap[K]>[0], tab.id);
|
|
|
|
return response;
|
|
} catch (error) {
|
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
console.error(`[Messaging] 向内容脚本发送消息失败 [Action: ${action}]:`, errorMsg);
|
|
|
|
if (errorMsg.includes('Could not establish connection')) {
|
|
return { success: false, message: '无法连接到网页,请刷新页面后再试' } as ReturnType<
|
|
ProtocolMap[K]
|
|
>;
|
|
}
|
|
if (errorMsg.includes('No response')) {
|
|
return { success: false, message: '网页响应超时,请重试' } as ReturnType<ProtocolMap[K]>;
|
|
}
|
|
|
|
return { success: false, message: `通信失败: ${errorMsg}` } as ReturnType<ProtocolMap[K]>;
|
|
}
|
|
}
|