useJobs.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { useEffect, useState } from "react";
  2. import { useQuery } from "@tanstack/react-query";
  3. import _ from "lodash";
  4. import { z } from "zod";
  5. import api from "shared/api";
  6. import { useRevisionList } from "./useRevisionList";
  7. const jobRunValidator = z.object({
  8. id: z.string(),
  9. name: z.string(),
  10. status: z.enum(["RUNNING", "SUCCESSFUL", "FAILED"]),
  11. created_at: z.string(),
  12. finished_at: z.string(),
  13. app_revision_id: z.string(),
  14. service_name: z.string(),
  15. });
  16. export type JobRun = z.infer<typeof jobRunValidator> & {
  17. revisionNumber: number;
  18. };
  19. export const useJobs = ({
  20. appName,
  21. projectId,
  22. clusterId,
  23. deploymentTargetId,
  24. selectedJobName,
  25. }: {
  26. appName: string;
  27. projectId: number;
  28. clusterId: number;
  29. deploymentTargetId: string;
  30. selectedJobName: string;
  31. }): {
  32. jobRuns: JobRun[];
  33. isLoadingJobRuns: boolean;
  34. } => {
  35. const [jobRuns, setJobRuns] = useState<JobRun[]>([]);
  36. const { revisionIdToNumber } = useRevisionList({
  37. appName,
  38. deploymentTargetId,
  39. projectId,
  40. clusterId,
  41. });
  42. const { data, isLoading: isLoadingJobRuns } = useQuery(
  43. [
  44. "jobRuns",
  45. appName,
  46. deploymentTargetId,
  47. revisionIdToNumber,
  48. selectedJobName,
  49. ],
  50. async () => {
  51. const res = await api.appJobs(
  52. "<token>",
  53. {
  54. deployment_target_id: deploymentTargetId,
  55. job_name: selectedJobName === "all" ? "" : selectedJobName,
  56. },
  57. {
  58. project_id: projectId,
  59. cluster_id: clusterId,
  60. porter_app_name: appName,
  61. }
  62. );
  63. const { job_runs: runs } = await z
  64. .object({
  65. job_runs: z.array(jobRunValidator),
  66. })
  67. .parseAsync(res.data);
  68. const parsedWithRevision = runs.map((jobRun) => {
  69. const revisionId = jobRun.app_revision_id;
  70. const revisionNumber = revisionIdToNumber[revisionId];
  71. return {
  72. ...jobRun,
  73. revisionNumber,
  74. };
  75. });
  76. return parsedWithRevision;
  77. },
  78. {
  79. enabled: revisionIdToNumber != null,
  80. refetchInterval: 5000,
  81. refetchOnWindowFocus: false,
  82. }
  83. );
  84. useEffect(() => {
  85. if (data != null) {
  86. setJobRuns(data);
  87. }
  88. }, [data]);
  89. return {
  90. jobRuns,
  91. isLoadingJobRuns,
  92. };
  93. };