Files
multica/packages/core/labels/queries.ts
Jiayuan Zhang c377d7fb4f feat(labels): add scoped label management (#5279)
* feat(labels): add scoped label management

* fix(labels): address review feedback

* fix(migrations): use unique label migration prefix
2026-07-12 03:46:08 +08:00

46 lines
1.5 KiB
TypeScript

import { queryOptions } from "@tanstack/react-query";
import { api } from "../api";
import type { LabelResourceType } from "../types";
export const labelKeys = {
all: (wsId: string) => ["labels", wsId] as const,
list: (wsId: string, resourceType: LabelResourceType = "issue") =>
[...labelKeys.all(wsId), "list", resourceType] as const,
detail: (wsId: string, id: string) =>
[...labelKeys.all(wsId), "detail", id] as const,
byIssue: (wsId: string, issueId: string) =>
[...labelKeys.all(wsId), "issue", issueId] as const,
byResource: (wsId: string, resourceType: "agent" | "skill", resourceId: string) =>
[...labelKeys.all(wsId), resourceType, resourceId] as const,
};
export function labelListOptions(wsId: string, resourceType: LabelResourceType = "issue") {
return queryOptions({
queryKey: labelKeys.list(wsId, resourceType),
queryFn: () => api.listLabels(resourceType),
select: (data) => data.labels,
});
}
export function resourceLabelsOptions(
wsId: string,
resourceType: "agent" | "skill",
resourceId: string,
) {
return queryOptions({
queryKey: labelKeys.byResource(wsId, resourceType, resourceId),
queryFn: () => api.listLabelsForResource(resourceType, resourceId),
select: (data) => data.labels,
enabled: Boolean(resourceId),
});
}
export function issueLabelsOptions(wsId: string, issueId: string) {
return queryOptions({
queryKey: labelKeys.byIssue(wsId, issueId),
queryFn: () => api.listLabelsForIssue(issueId),
select: (data) => data.labels,
enabled: Boolean(issueId),
});
}