useRedirectionHost.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
  2. import {
  3. createRedirectionHost,
  4. getRedirectionHost,
  5. type RedirectionHost,
  6. updateRedirectionHost,
  7. } from "src/api/backend";
  8. const fetchRedirectionHost = (id: number | "new") => {
  9. if (id === "new") {
  10. return Promise.resolve({
  11. id: 0,
  12. createdOn: "",
  13. modifiedOn: "",
  14. ownerUserId: 0,
  15. domainNames: [],
  16. forwardDomainName: "",
  17. preservePath: false,
  18. certificateId: 0,
  19. sslForced: false,
  20. advancedConfig: "",
  21. meta: {},
  22. http2Support: false,
  23. forwardScheme: "auto",
  24. forwardHttpCode: 301,
  25. blockExploits: false,
  26. enabled: true,
  27. hstsEnabled: false,
  28. hstsSubdomains: false,
  29. } as RedirectionHost);
  30. }
  31. return getRedirectionHost(id, ["owner"]);
  32. };
  33. const useRedirectionHost = (id: number | "new", options = {}) => {
  34. return useQuery<RedirectionHost, Error>({
  35. queryKey: ["redirection-host", id],
  36. queryFn: () => fetchRedirectionHost(id),
  37. staleTime: 60 * 1000, // 1 minute
  38. ...options,
  39. });
  40. };
  41. const useSetRedirectionHost = () => {
  42. const queryClient = useQueryClient();
  43. return useMutation({
  44. mutationFn: (values: RedirectionHost) =>
  45. values.id ? updateRedirectionHost(values) : createRedirectionHost(values),
  46. onMutate: (values: RedirectionHost) => {
  47. if (!values.id) {
  48. return;
  49. }
  50. const previousObject = queryClient.getQueryData(["redirection-host", values.id]);
  51. queryClient.setQueryData(["redirection-host", values.id], (old: RedirectionHost) => ({
  52. ...old,
  53. ...values,
  54. }));
  55. return () => queryClient.setQueryData(["redirection-host", values.id], previousObject);
  56. },
  57. onError: (_, __, rollback: any) => rollback(),
  58. onSuccess: async ({ id }: RedirectionHost) => {
  59. queryClient.invalidateQueries({ queryKey: ["redirection-host", id] });
  60. queryClient.invalidateQueries({ queryKey: ["redirection-hosts"] });
  61. queryClient.invalidateQueries({ queryKey: ["audit-logs"] });
  62. },
  63. });
  64. };
  65. export { useRedirectionHost, useSetRedirectionHost };