From 0e9c71ae9f6b92ede511f00df40eb90461641195 Mon Sep 17 00:00:00 2001 From: akhilmhdh Date: Tue, 27 Jun 2023 23:52:03 +0530 Subject: [PATCH] feat(multi-line): added support for multi-line in ui --- frontend/src/hooks/index.ts | 1 + frontend/src/hooks/useSyntaxHighlight.tsx | 45 ++++++ .../EnvComparisonRow/EnvComparisonRow.tsx | 126 ++++++--------- .../components/SecretInputRow/MaskedInput.tsx | 153 +++++++++--------- .../SecretInputRow/SecretInputRow.tsx | 57 +++---- 5 files changed, 200 insertions(+), 182 deletions(-) create mode 100644 frontend/src/hooks/useSyntaxHighlight.tsx diff --git a/frontend/src/hooks/index.ts b/frontend/src/hooks/index.ts index fc7acc575..a3ded034c 100644 --- a/frontend/src/hooks/index.ts +++ b/frontend/src/hooks/index.ts @@ -1,4 +1,5 @@ export { useLeaveConfirm } from "./useLeaveConfirm"; export { usePersistentState } from "./usePersistentState"; export { usePopUp } from "./usePopUp"; +export { useSyntaxHighlight } from "./useSyntaxHighlight"; export { useToggle } from "./useToggle"; diff --git a/frontend/src/hooks/useSyntaxHighlight.tsx b/frontend/src/hooks/useSyntaxHighlight.tsx new file mode 100644 index 000000000..edb3f85cd --- /dev/null +++ b/frontend/src/hooks/useSyntaxHighlight.tsx @@ -0,0 +1,45 @@ +import { faCircle } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useCallback } from "react"; + +const REGEX = /([$]{.*?})/g; + +export const useSyntaxHighlight = () => { + const syntaxHighlight = useCallback((text: string, isHidden?: boolean) => { + if (isHidden) { + return text + .split("") + .slice(0, 200) + .map((el, i) => + el === "\n" ? ( + el + ) : ( + + ) + ); + } + + // append a space on last new line this to show new line in ui for code component + const val = text.at(-1) === "\n" ? text.concat(" ") : text; + if (val?.length === 0) return EMPTY; + return val?.split(REGEX).map((word, i) => + word.match(REGEX) !== null ? ( + + ${ + {word.slice(2, word.length - 1)} + } + + ) : ( + + {word} + + ) + ); + }, []); + + return syntaxHighlight; +}; diff --git a/frontend/src/views/DashboardPage/components/EnvComparisonRow/EnvComparisonRow.tsx b/frontend/src/views/DashboardPage/components/EnvComparisonRow/EnvComparisonRow.tsx index 8b75eb39d..2c40e78f6 100644 --- a/frontend/src/views/DashboardPage/components/EnvComparisonRow/EnvComparisonRow.tsx +++ b/frontend/src/views/DashboardPage/components/EnvComparisonRow/EnvComparisonRow.tsx @@ -1,8 +1,9 @@ /* eslint-disable react/jsx-no-useless-fragment */ -import { useCallback, useState } from "react"; -import { faCircle, faEye, faEyeSlash, faKey, faMinus } from "@fortawesome/free-solid-svg-icons"; +import { useCallback, useRef, useState } from "react"; +import { faEye, faEyeSlash, faKey, faMinus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { twMerge } from "tailwind-merge"; +import { useToggle } from "~/hooks/useToggle"; +import { useSyntaxHighlight } from "@app/hooks"; type Props = { secrets: any[] | undefined; @@ -12,7 +13,8 @@ type Props = { userAvailableEnvs?: any[]; }; -const REGEX = /([$]{.*?})/g; +const SEC_VAL_LINE_HEIGHT = 21; +const MAX_MULTI_LINE = 6; const DashboardInput = ({ isOverridden, @@ -25,84 +27,54 @@ const DashboardInput = ({ isReadOnly?: boolean; secret?: any; }): JSX.Element => { - const syntaxHighlight = useCallback((val: string) => { - if (val === undefined) - return ( - - - - ); - if (val?.length === 0) - return EMPTY; - return val?.split(REGEX).map((word, index) => - word.match(REGEX) !== null ? ( - - {word.slice(0, 2)} - {word.slice(2, word.length - 1)} - {word.slice(word.length - 1, word.length) === "}" ? ( - - {word.slice(word.length - 1, word.length)} - - ) : ( - - {word.slice(word.length - 1, word.length)} - - )} - - ) : ( - - {word} - - ) - ); - }, []); + const ref = useRef(null); + const [isFocused, setIsFocused] = useToggle(); + const syntaxHighlight = useSyntaxHighlight(); + + const value = isOverridden ? secret.valueOverride : secret?.value || ""; + const multilineExpandUnit = ((value?.match(/\n/g)?.length || 0) + 1) * SEC_VAL_LINE_HEIGHT; + const maxMultilineHeight = Math.min(multilineExpandUnit, 21 * MAX_MULTI_LINE); return ( -
- +