useRevisionList.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { useQuery } from "@tanstack/react-query";
  2. import { useContext, useEffect, useState } from "react";
  3. import { Context } from "shared/Context";
  4. import api from "shared/api";
  5. import { z } from "zod";
  6. import {AppRevision, appRevisionValidator} from "../revisions/types";
  7. import {useLatestRevision} from "../../main/home/app-dashboard/app-view/LatestRevisionContext";
  8. export function useRevisionList(appName: string, deploymentTargetId: string) {
  9. const { currentProject, currentCluster } = useContext(Context);
  10. const {latestRevision} = useLatestRevision();
  11. const [
  12. revisionList,
  13. setRevisionList,
  14. ] = useState<AppRevision[]>([]);
  15. if (currentProject == null || currentCluster == null) {
  16. return [];
  17. }
  18. const {data} = useQuery(
  19. ["listAppRevisions", currentProject.id, currentCluster.id, appName, deploymentTargetId, latestRevision],
  20. async () => {
  21. const res = await api.listAppRevisions(
  22. "<token>",
  23. {
  24. deployment_target_id: deploymentTargetId,
  25. },
  26. {
  27. project_id: currentProject.id,
  28. cluster_id: currentCluster.id,
  29. porter_app_name: appName,
  30. }
  31. );
  32. const revisions = await z
  33. .object({
  34. app_revisions: z.array(appRevisionValidator),
  35. })
  36. .parseAsync(res.data);
  37. return revisions;
  38. }
  39. );
  40. useEffect(() => {
  41. if (data) {
  42. setRevisionList(data.app_revisions);
  43. }
  44. }, [data]);
  45. return revisionList;
  46. }
  47. export function useRevisionIdToNumber(appName: string, deploymentTargetId: string) {
  48. const revisionList = useRevisionList(appName, deploymentTargetId);
  49. const revisionIdToNumber: Record<string, number> = Object.fromEntries(revisionList.map(r => ([r.id, r.revision_number ])))
  50. return revisionIdToNumber;
  51. }
  52. export function useLatestRevisionNumber(appName: string, deploymentTargetId: string) {
  53. const revisionList = useRevisionList(appName, deploymentTargetId);
  54. return revisionList.map((revision) => revision.revision_number).reduce((a, b) => Math.max(a, b), 0)
  55. }