From d8313a161e2b63e38bc8c888139e96d6d127aaba Mon Sep 17 00:00:00 2001 From: carlosmonastyrski Date: Wed, 2 Apr 2025 15:27:05 -0300 Subject: [PATCH] Moved from useEffect to useMemo on PasswordGeneratorModal and remove it from secret-share --- .../PasswordGenerator/PasswordGenerator.tsx | 46 +++++++++++-------- .../components/ShareSecretForm.tsx | 33 +++++-------- 2 files changed, 38 insertions(+), 41 deletions(-) diff --git a/frontend/src/components/v2/PasswordGenerator/PasswordGenerator.tsx b/frontend/src/components/v2/PasswordGenerator/PasswordGenerator.tsx index c625c7e80..79e823ab4 100644 --- a/frontend/src/components/v2/PasswordGenerator/PasswordGenerator.tsx +++ b/frontend/src/components/v2/PasswordGenerator/PasswordGenerator.tsx @@ -1,8 +1,9 @@ -import { useEffect, useRef, useState } from "react"; -import { faCopy, faKey, faRefresh } from "@fortawesome/free-solid-svg-icons"; +import { useEffect, useMemo, useRef, useState } from "react"; +import { faCheck, faCopy, faKey, faRefresh } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Button, Checkbox, IconButton, Slider } from "@app/components/v2"; +import { useTimedReset } from "@app/hooks"; type PasswordOptionsType = { length: number; @@ -24,11 +25,13 @@ const PasswordGeneratorModal = ({ isOpen, onClose, onUsePassword, - minLength = 6, - maxLength = 32 + minLength = 12, + maxLength = 64 }: PasswordGeneratorModalProps) => { - const [password, setPassword] = useState(""); - const [copied, setCopied] = useState(false); + const [copyText, isCopying, setCopyText] = useTimedReset({ + initialState: "Copy" + }); + const [refresh, setRefresh] = useState(false); const [passwordOptions, setPasswordOptions] = useState({ length: minLength, useUppercase: true, @@ -61,8 +64,7 @@ const PasswordGeneratorModal = ({ newPassword += availableChars[randomIndex]; } - setPassword(newPassword); - setCopied(false); + return newPassword; }; useEffect(() => { @@ -81,14 +83,20 @@ const PasswordGeneratorModal = ({ return () => {}; }, [isOpen, onClose]); - useEffect(() => { - generatePassword(); - }, [passwordOptions]); + const password = useMemo(() => { + return generatePassword(); + }, [ + passwordOptions.length, + passwordOptions.useUppercase, + passwordOptions.useLowercase, + passwordOptions.useNumbers, + passwordOptions.useSpecialChars, + refresh + ]); const copyToClipboard = () => { navigator.clipboard.writeText(password).then(() => { - setCopied(true); - setTimeout(() => setCopied(false), 2000); + setCopyText("Copied"); }); }; @@ -105,7 +113,7 @@ const PasswordGeneratorModal = ({

Password Generator

@@ -119,7 +127,7 @@ const PasswordGeneratorModal = ({ size="xs" colorSchema="secondary" variant="outline_bg" - onClick={generatePassword} + onClick={() => setRefresh((prev) => !prev)} className="w-full text-bunker-300 hover:text-bunker-100" > @@ -133,8 +141,8 @@ const PasswordGeneratorModal = ({ onClick={copyToClipboard} className="w-full text-bunker-300 hover:text-bunker-100" > - - {copied ? "Copied!" : "Copy"} + + {copyText}
@@ -235,8 +243,8 @@ export type PasswordGeneratorProps = { export const PasswordGenerator = ({ onUsePassword, isDisabled = false, - minLength = 6, - maxLength = 32 + minLength = 12, + maxLength = 64 }: PasswordGeneratorProps) => { const [showGenerator, setShowGenerator] = useState(false); diff --git a/frontend/src/pages/public/ShareSecretPage/components/ShareSecretForm.tsx b/frontend/src/pages/public/ShareSecretPage/components/ShareSecretForm.tsx index 3166444e1..a2228e46b 100644 --- a/frontend/src/pages/public/ShareSecretPage/components/ShareSecretForm.tsx +++ b/frontend/src/pages/public/ShareSecretPage/components/ShareSecretForm.tsx @@ -6,15 +6,7 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { createNotification } from "@app/components/notifications"; -import { - Button, - FormControl, - IconButton, - Input, - PasswordGenerator, - Select, - SelectItem -} from "@app/components/v2"; +import { Button, FormControl, IconButton, Input, Select, SelectItem } from "@app/components/v2"; import { useTimedReset } from "@app/hooks"; import { useCreatePublicSharedSecret, useCreateSharedSecret } from "@app/hooks/api"; import { SecretSharingAccessType } from "@app/hooks/api/secretSharing"; @@ -175,19 +167,16 @@ export const ShareSecretForm = ({ errorText={error?.message} isOptional > -
- - -
+ )} />