mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
121 lines
3.6 KiB
TypeScript
121 lines
3.6 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
|||
|
|
import { workSessionsApi, type WorkSessionFilters } from "@/lib/api/work-sessions";
|
||
|
|
import type { WorkSession, WorkSessionCreate } from "@/types";
|
||
|
|
|
||
|
|
// Query keys
|
||
|
|
export const workSessionKeys = {
|
||
|
|
all: ["work-sessions"] as const,
|
||
|
|
lists: () => [...workSessionKeys.all, "list"] as const,
|
||
|
|
list: (filters?: WorkSessionFilters) => [...workSessionKeys.lists(), filters] as const,
|
||
|
|
details: () => [...workSessionKeys.all, "detail"] as const,
|
||
|
|
detail: (id: string) => [...workSessionKeys.details(), id] as const,
|
||
|
|
forTask: (taskId: string) => [...workSessionKeys.all, "task", taskId] as const,
|
||
|
|
};
|
||
|
|
|
||
|
|
// Hooks
|
||
|
|
export function useWorkSessions(filters?: WorkSessionFilters) {
|
||
|
|
return useQuery({
|
||
|
|
queryKey: workSessionKeys.list(filters),
|
||
|
|
queryFn: () => workSessionsApi.list(filters),
|
||
|
|
staleTime: 30000, // 30 seconds
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
export function useWorkSession(sessionId: string) {
|
||
|
|
return useQuery({
|
||
|
|
queryKey: workSessionKeys.detail(sessionId),
|
||
|
|
queryFn: () => workSessionsApi.get(sessionId),
|
||
|
|
enabled: !!sessionId,
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
export function useWorkSessionForTask(taskId: string) {
|
||
|
|
return useQuery({
|
||
|
|
queryKey: workSessionKeys.forTask(taskId),
|
||
|
|
queryFn: () => workSessionsApi.getForTask(taskId),
|
||
|
|
enabled: !!taskId,
|
||
|
|
staleTime: 10000, // 10 seconds
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
export function useCreateWorkSession() {
|
||
|
|
const queryClient = useQueryClient();
|
||
|
|
|
||
|
|
return useMutation({
|
||
|
|
mutationFn: (session: WorkSessionCreate) => workSessionsApi.create(session),
|
||
|
|
onSuccess: () => {
|
||
|
|
queryClient.invalidateQueries({ queryKey: workSessionKeys.lists() });
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
export function useWorkSessionActions() {
|
||
|
|
const queryClient = useQueryClient();
|
||
|
|
|
||
|
|
const invalidateSession = (session: WorkSession) => {
|
||
|
|
queryClient.invalidateQueries({ queryKey: workSessionKeys.lists() });
|
||
|
|
queryClient.setQueryData(workSessionKeys.detail(session.id), session);
|
||
|
|
if (session.task_id) {
|
||
|
|
queryClient.invalidateQueries({ queryKey: workSessionKeys.forTask(session.task_id) });
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
const addCommit = useMutation({
|
||
|
|
mutationFn: ({ sessionId, commitSha }: { sessionId: string; commitSha: string }) =>
|
||
|
|
workSessionsApi.addCommit(sessionId, commitSha),
|
||
|
|
onSuccess: invalidateSession,
|
||
|
|
});
|
||
|
|
|
||
|
|
const addFiles = useMutation({
|
||
|
|
mutationFn: ({ sessionId, filePaths }: { sessionId: string; filePaths: string[] }) =>
|
||
|
|
workSessionsApi.addFiles(sessionId, filePaths),
|
||
|
|
onSuccess: invalidateSession,
|
||
|
|
});
|
||
|
|
|
||
|
|
const createPR = useMutation({
|
||
|
|
mutationFn: ({
|
||
|
|
sessionId,
|
||
|
|
prNumber,
|
||
|
|
prUrl,
|
||
|
|
}: {
|
||
|
|
sessionId: string;
|
||
|
|
prNumber: number;
|
||
|
|
prUrl: string;
|
||
|
|
}) => workSessionsApi.createPR(sessionId, prNumber, prUrl),
|
||
|
|
onSuccess: invalidateSession,
|
||
|
|
});
|
||
|
|
|
||
|
|
const updatePRStatus = useMutation({
|
||
|
|
mutationFn: ({ sessionId, prStatus }: { sessionId: string; prStatus: string }) =>
|
||
|
|
workSessionsApi.updatePRStatus(sessionId, prStatus),
|
||
|
|
onSuccess: invalidateSession,
|
||
|
|
});
|
||
|
|
|
||
|
|
const mergePR = useMutation({
|
||
|
|
mutationFn: ({ sessionId, mergedBy }: { sessionId: string; mergedBy: string }) =>
|
||
|
|
workSessionsApi.mergePR(sessionId, mergedBy),
|
||
|
|
onSuccess: invalidateSession,
|
||
|
|
});
|
||
|
|
|
||
|
|
const complete = useMutation({
|
||
|
|
mutationFn: (sessionId: string) => workSessionsApi.complete(sessionId),
|
||
|
|
onSuccess: invalidateSession,
|
||
|
|
});
|
||
|
|
|
||
|
|
const abandon = useMutation({
|
||
|
|
mutationFn: ({ sessionId, reason }: { sessionId: string; reason?: string }) =>
|
||
|
|
workSessionsApi.abandon(sessionId, reason),
|
||
|
|
onSuccess: invalidateSession,
|
||
|
|
});
|
||
|
|
|
||
|
|
return {
|
||
|
|
addCommit,
|
||
|
|
addFiles,
|
||
|
|
createPR,
|
||
|
|
updatePRStatus,
|
||
|
|
mergePR,
|
||
|
|
complete,
|
||
|
|
abandon,
|
||
|
|
};
|
||
|
|
}
|