diff --git a/frontend/src/components/dashboard/CompareSecretsModal.tsx b/frontend/src/components/dashboard/CompareSecretsModal.tsx new file mode 100644 index 000000000..b5d81bc04 --- /dev/null +++ b/frontend/src/components/dashboard/CompareSecretsModal.tsx @@ -0,0 +1,88 @@ +import { SetStateAction, useEffect, useState } from 'react'; +import Image from 'next/image'; + +import { WorkspaceEnv } from '@app/hooks/api/types'; + +import getSecretsForProject from '../utilities/secrets/getSecretsForProject'; +import { Modal, ModalContent } from '../v2'; + +interface Secrets { + label: string; + secret: string; +} + +interface CompareSecretsModalProps { + compareModal: boolean; + setCompareModal: React.Dispatch>; + selectedEnv: WorkspaceEnv; + workspaceEnvs: WorkspaceEnv[]; + workspaceId: string; + currentSecret: { + key: string; + value: string; + }; +} + +const CompareSecretsModal = ({ + compareModal, + setCompareModal, + selectedEnv, + workspaceEnvs, + workspaceId, + currentSecret +}: CompareSecretsModalProps) => { + const [secrets, setSecrets] = useState([]); + + const getEnvSecrets = async () => { + const workspaceEnvironments = workspaceEnvs?.filter((env) => env !== selectedEnv); + const newSecrets = await Promise.all( + workspaceEnvironments.map(async (env) => { + // #TODO: optimize this query somehow... + const allSecrets = await getSecretsForProject({ env: env.slug, workspaceId }); + const secret = + allSecrets.find((item) => item.key === currentSecret.key)?.value ?? 'Not found'; + return { label: env.name, secret }; + }) + ); + setSecrets([{ label: selectedEnv.name, secret: currentSecret.value }, ...newSecrets]); + }; + + useEffect(() => { + if (compareModal) { + (async () => { + await getEnvSecrets(); + })(); + } + }, [compareModal]); + + return ( + + e.preventDefault()}> +
+ {secrets.length === 0 ? ( +
+ infisical loading indicator +
+ ) : ( + secrets.map((item) => ( +
+

{item.label}

+ +
+ )) + )} +
+
+
+ ); +}; +export default CompareSecretsModal; diff --git a/frontend/src/components/dashboard/SideBar.tsx b/frontend/src/components/dashboard/SideBar.tsx index 257d94996..d602e2c93 100644 --- a/frontend/src/components/dashboard/SideBar.tsx +++ b/frontend/src/components/dashboard/SideBar.tsx @@ -6,10 +6,12 @@ import { faX } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import SecretVersionList from '@app/ee/components/SecretVersionList'; +import { WorkspaceEnv } from '@app/hooks/api/types'; import Button from '../basic/buttons/Button'; import Toggle from '../basic/Toggle'; import CommentField from './CommentField'; +import CompareSecretsModal from './CompareSecretsModal'; import DashboardInputField from './DashboardInputField'; import { DeleteActionButton } from './DeleteActionButton'; import GenerateSecretMenu from './GenerateSecretMenu'; @@ -40,6 +42,9 @@ interface SideBarProps { sharedToHide: string[]; setSharedToHide: (values: string[]) => void; deleteRow: (props: DeleteRowFunctionProps) => void; + workspaceEnvs: WorkspaceEnv[]; + selectedEnv: WorkspaceEnv; + workspaceId: string; } /** @@ -63,11 +68,15 @@ const SideBar = ({ modifyComment, buttonReady, savePush, - deleteRow + deleteRow, + workspaceEnvs, + selectedEnv, + workspaceId }: SideBarProps) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [isLoading, setIsLoading] = useState(false); - const [overrideEnabled, setOverrideEnabled] = useState(data[0].valueOverride !== undefined); + const [overrideEnabled, setOverrideEnabled] = useState(data[0]?.valueOverride !== undefined); + const [compareModal, setCompareModal] = useState(false); const { t } = useTranslation(); return ( @@ -171,20 +180,38 @@ const SideBar = ({ /> )} -
-
+
+
); diff --git a/frontend/src/components/utilities/secrets/getSecretsForProject.ts b/frontend/src/components/utilities/secrets/getSecretsForProject.ts index c00f13d04..62c1e2e2d 100644 --- a/frontend/src/components/utilities/secrets/getSecretsForProject.ts +++ b/frontend/src/components/utilities/secrets/getSecretsForProject.ts @@ -29,8 +29,8 @@ interface SecretProps { interface FunctionProps { env: string; - setIsKeyAvailable: any; - setData: any; + setIsKeyAvailable?: any; + setData?: any; workspaceId: string; } @@ -58,7 +58,9 @@ const getSecretsForProject = async ({ const latestKey = await getLatestFileKey({ workspaceId }); // This is called isKeyAvailable but what it really means is if a person is able to create new key pairs - setIsKeyAvailable(!latestKey ? encryptedSecrets.length === 0 : true); + if (typeof setIsKeyAvailable === 'function') { + setIsKeyAvailable(!latestKey ? encryptedSecrets.length === 0 : true); + } const PRIVATE_KEY = localStorage.getItem('PRIVATE_KEY') as string; @@ -131,7 +133,10 @@ const getSecretsForProject = async ({ )[0]?.comment })); - setData(result); + if (typeof setData === 'function') { + setData(result); + } + return result; } catch (error) { console.log('Something went wrong during accessing or decripting secrets.'); diff --git a/frontend/src/components/v2/Modal/Modal.tsx b/frontend/src/components/v2/Modal/Modal.tsx index 8c979473b..41bfb9da7 100644 --- a/frontend/src/components/v2/Modal/Modal.tsx +++ b/frontend/src/components/v2/Modal/Modal.tsx @@ -25,7 +25,7 @@ export const ModalContent = forwardRef( diff --git a/frontend/src/pages/dashboard/[id].tsx b/frontend/src/pages/dashboard/[id].tsx index 99114a765..4a5bb8332 100644 --- a/frontend/src/pages/dashboard/[id].tsx +++ b/frontend/src/pages/dashboard/[id].tsx @@ -539,6 +539,9 @@ export default function Dashboard() { modifyValueOverride={listenChangeValueOverride} modifyComment={listenChangeComment} buttonReady={buttonReady} + workspaceEnvs={workspaceEnvs} + selectedEnv={selectedEnv} + workspaceId={workspaceId} savePush={savePush} sharedToHide={sharedToHide} setSharedToHide={setSharedToHide} @@ -870,7 +873,6 @@ export default function Dashboard() { ) : (
-
loading animation
); diff --git a/frontend/src/pages/users/[id].tsx b/frontend/src/pages/users/[id].tsx index abd1cfc6f..27b531444 100644 --- a/frontend/src/pages/users/[id].tsx +++ b/frontend/src/pages/users/[id].tsx @@ -207,7 +207,6 @@ export default function Users() {
) : (
-
loading animation
);