useStream.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
  2. import { createStream, getStream, type Stream, updateStream } from "src/api/backend";
  3. const fetchStream = (id: number | "new") => {
  4. if (id === "new") {
  5. return Promise.resolve({
  6. id: 0,
  7. createdOn: "",
  8. modifiedOn: "",
  9. ownerUserId: 0,
  10. tcpForwarding: true,
  11. udpForwarding: false,
  12. meta: {},
  13. enabled: true,
  14. certificateId: 0,
  15. } as Stream);
  16. }
  17. return getStream(id, ["owner"]);
  18. };
  19. const useStream = (id: number | "new", options = {}) => {
  20. return useQuery<Stream, Error>({
  21. queryKey: ["stream", id],
  22. queryFn: () => fetchStream(id),
  23. staleTime: 60 * 1000, // 1 minute
  24. ...options,
  25. });
  26. };
  27. const useSetStream = () => {
  28. const queryClient = useQueryClient();
  29. return useMutation({
  30. mutationFn: (values: Stream) => (values.id ? updateStream(values) : createStream(values)),
  31. onMutate: (values: Stream) => {
  32. if (!values.id) {
  33. return;
  34. }
  35. const previousObject = queryClient.getQueryData(["stream", values.id]);
  36. queryClient.setQueryData(["stream", values.id], (old: Stream) => ({
  37. ...old,
  38. ...values,
  39. }));
  40. return () => queryClient.setQueryData(["stream", values.id], previousObject);
  41. },
  42. onError: (_, __, rollback: any) => rollback(),
  43. onSuccess: async ({ id }: Stream) => {
  44. queryClient.invalidateQueries({ queryKey: ["stream", id] });
  45. queryClient.invalidateQueries({ queryKey: ["streams"] });
  46. queryClient.invalidateQueries({ queryKey: ["audit-logs"] });
  47. queryClient.invalidateQueries({ queryKey: ["host-report"] });
  48. queryClient.invalidateQueries({ queryKey: ["certificates"] });
  49. },
  50. });
  51. };
  52. export { useStream, useSetStream };