From 1d465a50c3eea0ac8913a503c192726e559db00d Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Wed, 20 Mar 2024 12:54:44 +0100 Subject: [PATCH] Feat: Visualize imported folders in overview page --- .../src/hooks/api/secretFolders/queries.tsx | 36 ++++++++++++++----- .../views/SecretMainPage/SecretMainPage.tsx | 12 ++++--- .../SecretOverviewPage/SecretOverviewPage.tsx | 12 ++++--- .../SecretOverviewFolderRow.tsx | 21 +++++++---- 4 files changed, 56 insertions(+), 25 deletions(-) diff --git a/frontend/src/hooks/api/secretFolders/queries.tsx b/frontend/src/hooks/api/secretFolders/queries.tsx index bcda2b0a4..a0e1db282 100644 --- a/frontend/src/hooks/api/secretFolders/queries.tsx +++ b/frontend/src/hooks/api/secretFolders/queries.tsx @@ -13,9 +13,9 @@ import { secretSnapshotKeys } from "../secretSnapshots/queries"; import { TCreateFolderDTO, TDeleteFolderDTO, + TFetchProjectFoldersResponse, TGetFoldersByEnvDTO, TGetProjectFoldersDTO, - TSecretFolder, TUpdateFolderDTO } from "./types"; @@ -25,14 +25,14 @@ export const folderQueryKeys = { }; const fetchProjectFolders = async (workspaceId: string, environment: string, path = "/") => { - const { data } = await apiRequest.get<{ folders: TSecretFolder[] }>("/api/v1/folders", { + const { data } = await apiRequest.get("/api/v1/folders", { params: { workspaceId, environment, path } }); - return data.folders; + return data; }; export const useGetProjectFolders = ({ @@ -43,9 +43,9 @@ export const useGetProjectFolders = ({ }: TGetProjectFoldersDTO & { options?: Omit< UseQueryOptions< - TSecretFolder[], + TFetchProjectFoldersResponse, unknown, - TSecretFolder[], + TFetchProjectFoldersResponse, ReturnType >, "queryKey" | "queryFn" @@ -74,7 +74,7 @@ export const useGetFoldersByEnv = ({ const folderNames = useMemo(() => { const names = new Set(); folders?.forEach(({ data }) => { - data?.forEach(({ name }) => { + data?.folders?.forEach(({ name }) => { names.add(name); }); }); @@ -85,16 +85,34 @@ export const useGetFoldersByEnv = ({ (name: string, env: string) => { const selectedEnvIndex = environments.indexOf(env); if (selectedEnvIndex !== -1) { - return Boolean( - folders?.[selectedEnvIndex]?.data?.find(({ name: folderName }) => folderName === name) + const isPresent = folders?.[selectedEnvIndex]?.data?.folders.find( + ({ name: folderName }) => folderName === name ); + + return Boolean(isPresent); } return false; }, [(folders || []).map((folder) => folder.data)] ); - return { folders, folderNames, isFolderPresentInEnv }; + const isImportedFolderPresentInEnv = useCallback( + (name: string, env: string) => { + const selectedEnvIndex = environments.indexOf(env); + + if (selectedEnvIndex !== -1) { + const isPresent = folders?.[selectedEnvIndex]?.data?.importedFolders.find( + ({ importPath }) => importPath === `/${name}` + ); + + return Boolean(isPresent); + } + return false; + }, + [(folders || []).map((folder) => folder.data)] + ); + + return { folders, folderNames, isFolderPresentInEnv, isImportedFolderPresentInEnv }; }; export const useCreateFolder = () => { diff --git a/frontend/src/views/SecretMainPage/SecretMainPage.tsx b/frontend/src/views/SecretMainPage/SecretMainPage.tsx index 312b676b7..bd8f0e7fe 100644 --- a/frontend/src/views/SecretMainPage/SecretMainPage.tsx +++ b/frontend/src/views/SecretMainPage/SecretMainPage.tsx @@ -104,7 +104,7 @@ export const SecretMainPage = () => { } }); // fetch folders - const { data: folders, isLoading: isFoldersLoading } = useGetProjectFolders({ + const { data: folderData, isLoading: isFoldersLoading } = useGetProjectFolders({ projectId: workspaceId, environment, path: secretPath @@ -163,7 +163,9 @@ export const SecretMainPage = () => { isPaused: !canDoReadRollback }); - const isNotEmtpy = Boolean(secrets?.length || folders?.length || secretImports?.length); + const isNotEmtpy = Boolean( + secrets?.length || folderData?.folders?.length || secretImports?.length + ); const handleSortToggle = () => setSortDir((state) => (state === SortDir.ASC ? SortDir.DESC : SortDir.ASC)); @@ -292,7 +294,7 @@ export const SecretMainPage = () => { /> )} { isProtectedBranch={isProtectedBranch} /> )} - {!canReadSecret && folders?.length === 0 && } + {!canReadSecret && folderData?.folders?.length === 0 && } { workspaceId={workspaceId} secretPath={secretPath} secrets={secrets} - folders={folders} + folders={folderData?.folders} snapshotCount={snapshotCount} onGoBack={handleResetSnapshot} onClickListSnapshot={() => handlePopUpToggle("snapshots", true)} diff --git a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx index ec8b5c2f9..ea70506b5 100644 --- a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx +++ b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx @@ -125,11 +125,12 @@ export const SecretOverviewPage = () => { secretPath, decryptFileKey: latestFileKey! }); - const { folders, folderNames, isFolderPresentInEnv } = useGetFoldersByEnv({ - projectId: workspaceId, - path: secretPath, - environments: userAvailableEnvs.map(({ slug }) => slug) - }); + const { folders, folderNames, isFolderPresentInEnv, isImportedFolderPresentInEnv } = + useGetFoldersByEnv({ + projectId: workspaceId, + path: secretPath, + environments: userAvailableEnvs.map(({ slug }) => slug) + }); const { mutateAsync: createSecretV3 } = useCreateSecretV3(); const { mutateAsync: updateSecretV3 } = useUpdateSecretV3(); @@ -639,6 +640,7 @@ export const SecretOverviewPage = () => { boolean; + isImportedFolderPresentInEnv: (name: string, env: string) => boolean; onClick: (path: string) => void; }; @@ -15,6 +16,7 @@ export const SecretOverviewFolderRow = ({ folderName, environments = [], isFolderPresentInEnv, + isImportedFolderPresentInEnv, onClick }: Props) => { return ( @@ -29,17 +31,24 @@ export const SecretOverviewFolderRow = ({ {environments.map(({ slug }, i) => { const isPresent = isFolderPresentInEnv(folderName, slug); + const isImportPresent = isImportedFolderPresentInEnv(folderName, slug); return ( -
- -
+ +
+ +
+
); })}