fix: load complete authoring capability catalog
This commit is contained in:
@@ -28,7 +28,7 @@ export const DraftDetailRoute = ({
|
||||
? { kind: "capability", qualifiedName: capabilityName }
|
||||
: { kind: "canvas" };
|
||||
const drafts = useDraftWorkspace(workspaceId);
|
||||
const capabilities = useCapabilityDiscovery();
|
||||
const capabilities = useCapabilityDiscovery({ loadAllPages: true });
|
||||
const draft =
|
||||
drafts.selected?.workspaceId === workspaceId ? drafts.selected : null;
|
||||
|
||||
|
||||
@@ -217,6 +217,25 @@ describe("useCapabilityDiscovery", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
it("loads every capability page for authoring palettes", async () => {
|
||||
client.list
|
||||
.mockResolvedValueOnce(page([summary("serena.default.search")], "page-2"))
|
||||
.mockResolvedValueOnce(page([summary("wf.std.constant", "wf.std")]));
|
||||
|
||||
const { result } = renderHook(() =>
|
||||
useCapabilityDiscovery({ loadAllPages: true }),
|
||||
);
|
||||
|
||||
await waitFor(() =>
|
||||
expect(result.current.items.map((item) => item.name)).toEqual([
|
||||
"serena.default.search",
|
||||
"wf.std.constant",
|
||||
]),
|
||||
);
|
||||
expect(client.list).toHaveBeenLastCalledWith({ cursor: "page-2", limit: 50 });
|
||||
expect(result.current.nextCursor).toBeNull();
|
||||
});
|
||||
|
||||
it("uses the applied filters when loading more after draft edits", async () => {
|
||||
client.list
|
||||
.mockResolvedValueOnce(page([summary("local.documents.read")], "page-2"))
|
||||
|
||||
@@ -27,6 +27,10 @@ export type CapabilityDiscoveryController = {
|
||||
readonly inspect: (qualifiedName: string) => void;
|
||||
};
|
||||
|
||||
export type CapabilityDiscoveryOptions = {
|
||||
readonly loadAllPages?: boolean;
|
||||
};
|
||||
|
||||
type DiscoveryState = Omit<CapabilityDiscoveryController, "setQuery" | "setSourceId" | "search" | "loadMore" | "inspect">;
|
||||
|
||||
type CapabilityFilters = {
|
||||
@@ -92,7 +96,9 @@ const isSameConnection = (
|
||||
return left.readExecutor === right.readExecutor && left.connectedTarget === right.connectedTarget;
|
||||
};
|
||||
|
||||
export const useCapabilityDiscovery = (): CapabilityDiscoveryController => {
|
||||
export const useCapabilityDiscovery = (
|
||||
{ loadAllPages = false }: CapabilityDiscoveryOptions = {},
|
||||
): CapabilityDiscoveryController => {
|
||||
const { connectedTarget, readExecutor } = useConsoleWorkspace();
|
||||
const client = useMemo<CapabilityClient | null>(
|
||||
() => (readExecutor ? createCapabilityClient(readExecutor) : null),
|
||||
@@ -218,6 +224,13 @@ export const useCapabilityDiscovery = (): CapabilityDiscoveryController => {
|
||||
state.phase,
|
||||
]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!loadAllPages || state.phase !== "ready" || state.nextCursor === null) return;
|
||||
// Authoring palettes need the complete catalog because they do not expose
|
||||
// discovery pagination; continue one page at a time through the same guarded loader.
|
||||
loadMore();
|
||||
}, [loadAllPages, loadMore, state.nextCursor, state.phase]);
|
||||
|
||||
const inspect = useCallback(
|
||||
(qualifiedName: string) => {
|
||||
if (!client) return;
|
||||
|
||||
Reference in New Issue
Block a user