File size: 4,927 Bytes
9b906ea | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import AutomationService from "#/api/automation-service/automation-service.api";
import { useActiveBackend } from "#/contexts/active-backend-context";
import { useTracking } from "#/hooks/use-tracking";
import type { Automation, AutomationSpec } from "#/types/automation";
import {
AUTOMATION_DETAIL_QUERY_KEY,
AUTOMATION_RUNS_QUERY_KEY,
} from "./use-automation-detail";
export const AUTOMATIONS_QUERY_KEY = ["automations"] as const;
interface UseAutomationsOptions {
limit?: number;
offset?: number;
enabled?: boolean;
}
export function useAutomations(options: UseAutomationsOptions = {}) {
const { limit = 50, offset = 0, enabled = true } = options;
const active = useActiveBackend();
return useQuery({
queryKey: [
...AUTOMATIONS_QUERY_KEY,
{ limit, offset },
active.backend.id,
active.orgId,
],
queryFn: () => AutomationService.getAutomations(limit, offset),
staleTime: 0,
enabled,
});
}
export function useToggleAutomation() {
const queryClient = useQueryClient();
const active = useActiveBackend();
const { trackAutomationDisableButton } = useTracking();
return useMutation({
mutationFn: ({ id, enabled }: { id: string; enabled: boolean }) =>
AutomationService.toggleAutomation(id, enabled),
onSuccess: (_data, variables) => {
queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });
queryClient.invalidateQueries({ queryKey: AUTOMATION_DETAIL_QUERY_KEY });
if (!variables.enabled) {
trackAutomationDisableButton({ backendKind: active.backend.kind });
}
},
});
}
export function useImportAutomation() {
const queryClient = useQueryClient();
const active = useActiveBackend();
const { trackAutomationImported } = useTracking();
return useMutation({
mutationFn: (spec: AutomationSpec) =>
AutomationService.createAutomation({ ...spec, enabled: false }),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });
trackAutomationImported({ backendKind: active.backend.kind });
},
});
}
export function useUpdateAutomation() {
const queryClient = useQueryClient();
const active = useActiveBackend();
const { trackAutomationEdited } = useTracking();
return useMutation({
mutationFn: ({ id, body }: { id: string; body: Partial<Automation> }) =>
AutomationService.updateAutomation(id, body),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });
queryClient.invalidateQueries({ queryKey: AUTOMATION_DETAIL_QUERY_KEY });
trackAutomationEdited({ backendKind: active.backend.kind });
},
});
}
export function useDeleteAutomation() {
const queryClient = useQueryClient();
const active = useActiveBackend();
const { trackAutomationDeleted } = useTracking();
return useMutation({
mutationFn: (id: string) => AutomationService.deleteAutomation(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });
trackAutomationDeleted({ backendKind: active.backend.kind });
},
});
}
export function useDispatchAutomation() {
const queryClient = useQueryClient();
const active = useActiveBackend();
const { trackAutomationExecuted } = useTracking();
return useMutation({
mutationFn: (id: string) => AutomationService.dispatchAutomation(id),
onSuccess: (_run, id) => {
queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });
queryClient.invalidateQueries({ queryKey: AUTOMATION_DETAIL_QUERY_KEY });
queryClient.invalidateQueries({
queryKey: [...AUTOMATION_RUNS_QUERY_KEY, id],
});
// Runs carry a conversation_id surfaced in the sidebar, and the
// conversation poll is paused on automation routes, so refresh the list
// explicitly (same prefix all conversation mutations invalidate).
queryClient.invalidateQueries({ queryKey: ["user", "conversations"] });
trackAutomationExecuted({ backendKind: active.backend.kind });
},
});
}
export function useCancelAutomationRun() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ runId }: { automationId: string; runId: string }) =>
AutomationService.cancelAutomationRun(runId),
onSuccess: (_run, { automationId }) => {
queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });
queryClient.invalidateQueries({ queryKey: AUTOMATION_DETAIL_QUERY_KEY });
queryClient.invalidateQueries({
queryKey: [...AUTOMATION_RUNS_QUERY_KEY, automationId],
});
// Same staleness hole as dispatch: the cancelled run's conversation
// shows in the sidebar while the poll is paused on automation routes.
queryClient.invalidateQueries({ queryKey: ["user", "conversations"] });
},
});
}
|