feat(diagnostic): refactor services with monitor and context providers
- Update default-diagnostic-service.ts - Update diagnostic-monitor-context.tsx - Update diagnostic-service-context.tsx - Update monitored-diagnostic-service.ts - Update teacher diagnostic page
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
"use client"
|
||||
|
||||
import { createContext, useContext, type ReactNode } from "react"
|
||||
import { createContext, useContext, useMemo, type ReactNode } from "react"
|
||||
|
||||
import type { DiagnosticService } from "./diagnostic-service"
|
||||
import { defaultDiagnosticService } from "./default-diagnostic-service"
|
||||
import { createMonitoredDiagnosticService } from "./monitored-diagnostic-service"
|
||||
import { noopDiagnosticMonitor } from "./diagnostic-monitor"
|
||||
import { useDiagnosticMonitor } from "./diagnostic-monitor-context"
|
||||
|
||||
/**
|
||||
* v2-P1-4: 诊断模块服务 Context。
|
||||
@@ -10,13 +14,14 @@ import type { DiagnosticService } from "./diagnostic-service"
|
||||
* 组件通过 useDiagnosticService() 获取服务实现,
|
||||
* 而非直接 import actions,实现依赖反转。
|
||||
*
|
||||
* 默认由 DefaultDiagnosticServiceProvider 注入真实实现(调用 Server Actions);
|
||||
* 默认由 DiagnosticServiceProvider 在客户端组装默认实现(调用 Server Actions);
|
||||
* 测试时可注入 mock 实现以隔离组件测试。
|
||||
*/
|
||||
const DiagnosticServiceContext = createContext<DiagnosticService | null>(null)
|
||||
|
||||
interface DiagnosticServiceProviderProps {
|
||||
service: DiagnosticService
|
||||
/** 可选自定义服务实现,未传则使用 defaultDiagnosticService + 监控包装 */
|
||||
service?: DiagnosticService
|
||||
children: ReactNode
|
||||
}
|
||||
|
||||
@@ -24,8 +29,18 @@ export function DiagnosticServiceProvider({
|
||||
service,
|
||||
children,
|
||||
}: DiagnosticServiceProviderProps): ReactNode {
|
||||
const monitor = useDiagnosticMonitor()
|
||||
const value = useMemo<DiagnosticService>(() => {
|
||||
if (service) return service
|
||||
// 客户端组装:默认 service + 监控埋点包装
|
||||
return createMonitoredDiagnosticService(
|
||||
defaultDiagnosticService,
|
||||
monitor ?? noopDiagnosticMonitor,
|
||||
)
|
||||
}, [service, monitor])
|
||||
|
||||
return (
|
||||
<DiagnosticServiceContext.Provider value={service}>
|
||||
<DiagnosticServiceContext.Provider value={value}>
|
||||
{children}
|
||||
</DiagnosticServiceContext.Provider>
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user