From a224f192b62b5abee9234da5e0277f6c5db1c1b8 Mon Sep 17 00:00:00 2001 From: bilalabbad Date: Tue, 4 Feb 2025 14:57:37 +0100 Subject: [PATCH] Split node diff into multiple components --- .../entities/diff/api/update-diff-from-api.ts | 25 ++++++ .../diff/domain/update-diff.mutation.ts | 8 ++ .../src/entities/diff/domain/update-diff.ts | 7 ++ .../app/src/entities/diff/node-diff/index.tsx | 76 ++----------------- .../src/entities/diff/ui/diff-computing.tsx | 37 +++++++++ .../app/src/entities/diff/ui/diff-empty.tsx | 33 ++++++++ .../entities/diff/ui/diff-refresh-button.tsx | 18 +++++ 7 files changed, 136 insertions(+), 68 deletions(-) create mode 100644 frontend/app/src/entities/diff/api/update-diff-from-api.ts create mode 100644 frontend/app/src/entities/diff/domain/update-diff.mutation.ts create mode 100644 frontend/app/src/entities/diff/domain/update-diff.ts create mode 100644 frontend/app/src/entities/diff/ui/diff-computing.tsx create mode 100644 frontend/app/src/entities/diff/ui/diff-empty.tsx create mode 100644 frontend/app/src/entities/diff/ui/diff-refresh-button.tsx diff --git a/frontend/app/src/entities/diff/api/update-diff-from-api.ts b/frontend/app/src/entities/diff/api/update-diff-from-api.ts new file mode 100644 index 0000000000..41b3fc14dc --- /dev/null +++ b/frontend/app/src/entities/diff/api/update-diff-from-api.ts @@ -0,0 +1,25 @@ +import graphqlClient from "@/shared/api/graphql/graphqlClientApollo"; +import { gql } from "@apollo/client"; + +export const DIFF_UPDATE = gql` + mutation DIFF_UPDATE($branchName: String!, $waitForCompletion: Boolean) { + DiffUpdate(data: { branch: $branchName, wait_for_completion: $waitForCompletion }) { + ok + } + } +`; + +export type UpdateDiffFromApiParams = { + branchName: string; + waitForCompletion: boolean; +}; + +export const updateDiffFromApi = ({ branchName, waitForCompletion }: UpdateDiffFromApiParams) => { + return graphqlClient.mutate({ + mutation: DIFF_UPDATE, + variables: { + branchName, + waitForCompletion, + }, + }); +}; diff --git a/frontend/app/src/entities/diff/domain/update-diff.mutation.ts b/frontend/app/src/entities/diff/domain/update-diff.mutation.ts new file mode 100644 index 0000000000..bb776e3ee0 --- /dev/null +++ b/frontend/app/src/entities/diff/domain/update-diff.mutation.ts @@ -0,0 +1,8 @@ +import { updateDiff } from "@/entities/diff/domain/update-diff"; +import { useMutation } from "@tanstack/react-query"; + +export function useUpdateDiffMutation() { + return useMutation({ + mutationFn: (branchName: string) => updateDiff(branchName), + }); +} diff --git a/frontend/app/src/entities/diff/domain/update-diff.ts b/frontend/app/src/entities/diff/domain/update-diff.ts new file mode 100644 index 0000000000..62101194ae --- /dev/null +++ b/frontend/app/src/entities/diff/domain/update-diff.ts @@ -0,0 +1,7 @@ +import { updateDiffFromApi } from "@/entities/diff/api/update-diff-from-api"; + +export type UpdateDiff = (branchName: string) => Promise; + +export const updateDiff: UpdateDiff = async (branchName) => { + await updateDiffFromApi({ branchName, waitForCompletion: true }); +}; diff --git a/frontend/app/src/entities/diff/node-diff/index.tsx b/frontend/app/src/entities/diff/node-diff/index.tsx index d886d4b373..a4dba85f0c 100644 --- a/frontend/app/src/entities/diff/node-diff/index.tsx +++ b/frontend/app/src/entities/diff/node-diff/index.tsx @@ -6,21 +6,19 @@ import { DIFF_UPDATE } from "@/entities/diff/api/diff-update"; import DiffTree from "@/entities/diff/diff-tree"; import { DIFF_STATUS, DiffNode as DiffNodeType } from "@/entities/diff/node-diff/types"; import { DiffBadge } from "@/entities/diff/node-diff/utils"; +import { DiffComputing } from "@/entities/diff/ui/diff-computing"; +import { DiffEmpty } from "@/entities/diff/ui/diff-empty"; import { getProposedChangesDiffTree } from "@/entities/proposed-changes/api/getProposedChangesDiffTree"; import { proposedChangedState } from "@/entities/proposed-changes/stores/proposedChanges.atom"; import { schemaState } from "@/entities/schema/stores/schema.atom"; import graphqlClient from "@/shared/api/graphql/graphqlClientApollo"; import useQuery from "@/shared/api/graphql/useQuery"; -import { Button, ButtonProps } from "@/shared/components/buttons/button-primitive"; +import { Button } from "@/shared/components/buttons/button-primitive"; import { DateDisplay } from "@/shared/components/display/date-display"; import ErrorScreen from "@/shared/components/errors/error-screen"; import LoadingScreen from "@/shared/components/loading-screen"; import { ALERT_TYPES, Alert } from "@/shared/components/ui/alert"; -import { Badge } from "@/shared/components/ui/badge"; -import { Tooltip } from "@/shared/components/ui/tooltip"; import { datetimeAtom } from "@/shared/stores/time.atom"; -import { classNames } from "@/shared/utils/common"; -import { formatFullDate, formatRelativeTimeFromNow } from "@/shared/utils/date"; import { NetworkStatus, useMutation } from "@apollo/client"; import { Icon } from "@iconify-icon/react"; import { useAtomValue } from "jotai"; @@ -131,64 +129,15 @@ export const NodeDiff = ({ branchName, filters }: NodeDiffProps) => { // If DiffTree is null, it means that diff is still being computed. if (!diffTreeData) { return ( -
- - -

- We are computing the diff between{" "} - - {" "} - {proposedChangesDetails.source_branch?.value} - {" "} - and{" "} - - {" "} - {proposedChangesDetails.destination_branch?.value} - -

- -
-

This process may take a few seconds to a few minutes.

-

Once completed, you'll be able to view the detailed changes.

-
- - -
+ ); } if (!qspStatus && diffTreeData.nodes.length === 0) { - return ( -
-
- -
- -

No changes detected

-
-

- The last comparison was made{" "} - - - {formatRelativeTimeFromNow(diffTreeData.to_time)} - - - . -

-

If you have made any changes, please refresh the diff:

-
- - -
- ); + return ; } // Manually filter conflicts items since it's not available yet in the backend filters @@ -271,12 +220,3 @@ export const NodeDiff = ({ branchName, filters }: NodeDiffProps) => { ); }; - -const RefreshButton = ({ isLoading, ...props }: ButtonProps) => { - return ( - - ); -}; diff --git a/frontend/app/src/entities/diff/ui/diff-computing.tsx b/frontend/app/src/entities/diff/ui/diff-computing.tsx new file mode 100644 index 0000000000..bee99a13ca --- /dev/null +++ b/frontend/app/src/entities/diff/ui/diff-computing.tsx @@ -0,0 +1,37 @@ +import { DiffRefreshButton } from "@/entities/diff/ui/diff-refresh-button"; +import LoadingScreen from "@/shared/components/loading-screen"; +import { Badge } from "@/shared/components/ui/badge"; +import { Icon } from "@iconify-icon/react"; + +export interface DiffComputingProps { + sourceBranch: string; + destinationBranch: string; +} + +export function DiffComputing({ sourceBranch, destinationBranch }: DiffComputingProps) { + return ( +
+ + +

+ We are computing the diff between + + + {sourceBranch} + + and + + + {destinationBranch} + +

+ +
+

This process may take a few seconds to a few minutes.

+

Once completed, you'll be able to view the detailed changes.

+
+ + +
+ ); +} diff --git a/frontend/app/src/entities/diff/ui/diff-empty.tsx b/frontend/app/src/entities/diff/ui/diff-empty.tsx new file mode 100644 index 0000000000..0049959a61 --- /dev/null +++ b/frontend/app/src/entities/diff/ui/diff-empty.tsx @@ -0,0 +1,33 @@ +import { DiffRefreshButton } from "@/entities/diff/ui/diff-refresh-button"; +import { Tooltip } from "@/shared/components/ui/tooltip"; +import { formatFullDate, formatRelativeTimeFromNow } from "@/shared/utils/date"; +import { Icon } from "@iconify-icon/react"; + +export interface DiffEmptyProps { + branchName: string; + lastRefreshedAt: Date; +} + +export function DiffEmpty({ branchName, lastRefreshedAt }: DiffEmptyProps) { + return ( +
+
+ +
+ +

No changes detected

+
+

+ The last comparison was made{" "} + + {formatRelativeTimeFromNow(lastRefreshedAt)} + + . +

+

If you have made any changes, please refresh the diff:

+
+ + +
+ ); +} diff --git a/frontend/app/src/entities/diff/ui/diff-refresh-button.tsx b/frontend/app/src/entities/diff/ui/diff-refresh-button.tsx new file mode 100644 index 0000000000..e1a89cc715 --- /dev/null +++ b/frontend/app/src/entities/diff/ui/diff-refresh-button.tsx @@ -0,0 +1,18 @@ +import { useUpdateDiffMutation } from "@/entities/diff/domain/update-diff.mutation"; +import { Button } from "@/shared/components/buttons/button-primitive"; +import { classNames } from "@/shared/utils/common"; +import { Icon } from "@iconify-icon/react"; + +export function DiffRefreshButton({ branchName }: { branchName: string }) { + const updateDiffMutation = useUpdateDiffMutation(); + + return ( + + ); +}