sdlc-hub/web/src/shell/activity/activity.ts
2026-10-24 15:30:12 +04:00

44 lines
2.7 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 { createContext, useCallback, useContext } from "react";
import type { AgentView, Batch } from "../../api/types.ts";
import type { ModuleEvent } from "./events.ts";
// состояние модуля, которое ядро держит за него: агент, текущее событие пакета, блокировка кнопки обновления
export interface ModuleActivity {
agent: AgentView | null;
event: ModuleEvent | null;
busy: boolean; // запрос постановки в пути или отслеживаемый пакет — пакет действия обновления модуля
running: Batch | null; // отслеживаемый пакет (последний ответ опроса)
start(): Promise<void>; // «обновить» текущий проект модуля; без проекта у модуля с охватом «проект» — ничего
track(batchId: number): void; // опрашивать уже поставленный пакет (после создания проекта)
}
export interface ActivityValue {
agents: AgentView[];
modules: Record<string, ModuleActivity>;
summary: "error" | "busy" | "online" | "offline";
trackBatch(batchId: number): Promise<void>; // пакет без известного модуля: модуль берётся из ответа хаба
}
export const AGENTS_KEY = ["agents"] as const;
export const ActivityContext = createContext<ActivityValue | null>(null);
function useActivity(): ActivityValue {
const v = useContext(ActivityContext);
if (!v) throw new Error("активность модулей вызвана вне ActivityProvider: оберните оболочку в <ActivityProvider>");
return v;
}
export function useModuleActivity(name: string): ModuleActivity {
const m = useActivity().modules[name];
if (!m) throw new Error(`у модуля «${name}» нет описания состояния (HubModule.status)`);
return m;
}
// отслеживать пакет, поставленный хабом конкретному модулю (после создания/правки проекта); неизвестный модуль пропускается
export function useTrackModuleBatch(): (module: string, batchId: number) => void {
const { modules } = useActivity();
return useCallback((module, id) => { modules[module]?.track(id); }, [modules]);
}
export const useAgents = (): AgentView[] => useActivity().agents;
export const useActivitySummary = (): ActivityValue["summary"] => useActivity().summary;
export const useTrackBatch = (): ActivityValue["trackBatch"] => useActivity().trackBatch;